File Name
Size
Date
{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}{\f4\fswiss\fprq2\fcharset0 Liberation Sans{\*\falt Arial};}{\f5\fnil\fprq0\fcharset0 Times New Roman;}{\f6\fmodern\fprq1\fcharset0 Liberation Mono{\*\falt Courier New};}{\f7\fnil\fprq2\fcharset0 Noto Sans CJK SC;}{\f8\fmodern\fprq1\fcharset0 DejaVu Sans Mono;}{\f9\fnil\fprq2\fcharset0 Lohit Devanagari;}{\f10\fnil\fprq0\fcharset128 Lohit Devanagari;}}
{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}
{\stylesheet{\s0\snext0\widctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af9\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105 Normal;}
{\*\cs15\snext15\cf9\ul\ulc0\langfe255\alang255\lang255 Internet Link;}
{\*\cs16\snext16\b\ab Strong Emphasis;}
{\*\cs17\snext17 Numbering Symbols;}
{\s18\sbasedon0\snext19\sb240\sa120\keepn\dbch\af7\dbch\af9\afs28\loch\f4\fs28 Heading;}
{\s19\sbasedon0\snext19\sl276\slmult1\sb0\sa140 Text Body;}
{\s20\sbasedon19\snext20\sl276\slmult1\sb0\sa140\dbch\af10 List;}
{\s21\sbasedon0\snext21\sb120\sa120\noline\i\dbch\af10\afs24\ai\fs24 Caption;}
{\s22\sbasedon0\snext22\noline\dbch\af10 Index;}
{\s23\sbasedon0\snext23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20 Preformatted Text;}
}{\*\listtable{\list\listtemplateid1
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'00.;}{\levelnumbers\'01;}\fi0\li707}
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'01.;}{\levelnumbers\'01;}\fi-283\li1414}
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'02.;}{\levelnumbers\'01;}\fi-283\li2121}
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'03.;}{\levelnumbers\'01;}\fi-283\li2828}
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'04.;}{\levelnumbers\'01;}\fi-283\li3535}
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'05.;}{\levelnumbers\'01;}\fi-283\li4242}
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'06.;}{\levelnumbers\'01;}\fi-283\li4949}
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'07.;}{\levelnumbers\'01;}\fi-283\li5656}
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'08.;}{\levelnumbers\'01;}\fi-283\li6363}\listid1}
{\list\listtemplateid2
{\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0}
{\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0}
{\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0}
{\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0}
{\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0}
{\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0}
{\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0}
{\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0}
{\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0}\listid2}
}{\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}}{\*\generator LibreOffice/6.0.7.3$Linux_X86_64 LibreOffice_project/00m0$Build-3}{\info{\creatim\yr2019\mo8\dy22\hr21\min4}{\revtim\yr2019\mo8\dy22\hr21\min5}{\printim\yr0\mo0\dy0\hr0\min0}}{\*\userprops}\deftab709
\viewscale100
{\*\pgdsctbl
{\pgdsc0\pgdscuse451\pgwsxn12240\pghsxn15840\marglsxn240\margrsxn375\margtsxn1134\margbsxn1134\pgdscnxt0 Default Style;}}
\formshade\paperh15840\paperw12240\margl240\margr375\margt1134\margb1134\sectd\sbknone\sectunlocked1\pgndec\pgwsxn12240\pghsxn15840\marglsxn240\margrsxn375\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
{\*\ftnsep\chftnsep}\pgndec\pard\plain \s0\widctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af9\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\widctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa283{{\field{\*\fldinst HYPERLINK "https://web.archive.org/web/20080301221231/http://www.seedwiki.com/wiki/ff_compatibility_list" }{\fldrslt {\cf9\ul\ulc0\langfe255\alang255\lang255\scaps0\caps0\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
Compatibility List}{}}}\rtlch \ltrch\loch
\line }{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
Current Build:\~}{{\field{\*\fldinst HYPERLINK "https://web.archive.org/web/20080301221231/http://xbox.nugnugnug.com/FlickerFucker/ff_build007.zip" }{\fldrslt {\cf9\ul\ulc0\langfe255\alang255\lang255\scaps0\caps0\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
007}{}}}\scaps0\caps0\cf1\expnd0\expndtw0\rtlch \ltrch\loch
\~}{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
(windows executable)\~\~}{{\field{\*\fldinst HYPERLINK "https://web.archive.org/web/20080301221231/http://xbox.nugnugnug.com/FlickerFucker/ff_build007_src.zip" }{\fldrslt {\cf9\ul\ulc0\langfe255\alang255\lang255\scaps0\caps0\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
Source}{}}}\scaps0\caps0\cf1\expnd0\expndtw0\rtlch \ltrch\loch
\~}{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
(MSVC++)\~}{\rtlch \ltrch\loch
\line \line }{\cs16\b\ab\scaps0\caps0\cf1\expnd0\expndtw0\i0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
What is FlickerFucker?}{\rtlch \ltrch\loch
\line \line }{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
FlickerFucker (FF) is a windows based, xbox executable patching utility which changes the behaviour of the default FlickerFilter settings.}{\rtlch \ltrch\loch
\line \line }{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
The FlickerFilter is a bit of hardware built into the xbox itself, which can be controlled by software.\~ Due to a television's slight over and underscan when drawing a screen, there is often a bit of jumpiness and flicker on finely drawn details, such as text.\~ To keep text from being too jumpy, the FlickerFilter allows the image to be blurred slightly, which reduces the amount of jumpiness in trade for image sharpness.}{\rtlch \ltrch\loch
\line \line }{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
Virtually every single xbox title defaults the FlickerFilter to a value of 5, the maximum amount of blurring available, and offers no means to reduce the amount through in game options.}{\rtlch \ltrch\loch
\line \line }{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
FF allows you to force the amount of FlickerFilter used in a game.\~ You can turn it off altogether or select any amount of flicker filtering between 1 (minimum) and 5 (maximum).}{\rtlch \ltrch\loch
\line \line }{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
Obviously this is only true for Standard Definition Interlaced TV\u180\'b4s (15khz), and the benefit will be proportional to the quality of the cables used for connecting the Xbox to the TV (best results with Scart RGB cables, worst with composite cables)}{\rtlch \ltrch\loch
\line \line }{\cs16\b\ab\scaps0\caps0\cf1\expnd0\expndtw0\i0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
Usage\line }{\rtlch \ltrch\loch
\line }{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
FF is a windows application which runs on your PC.\~ This means that you have to take xbox executables off your xbox and put them on your PC in order to patch them.\~\~}
\par \pard\plain \s19\sl276\slmult1\sb0\sa140{\listtext\pard\plain 1.\tab}\ilvl0\ls1 \li0\ri0\lin0\rin0\fi0\widctlpar\tx707\li707\ri0\lin707\rin0\fi0\sb0\sa0{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
FTP the game's default.xbe file from your xbox to your PC.}
\par \pard\plain \s19\sl276\slmult1\sb0\sa140{\listtext\pard\plain 2.\tab}\ilvl0\ls1 \li0\ri0\lin0\rin0\fi0\widctlpar\tx707\li707\ri0\lin707\rin0\fi0\sb0\sa0{\scaps0\caps0\cf6\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
Make a backup of the default.xbe file, just in case you don't like what FF does to the display.\~ There is no undo!}
\par \pard\plain \s19\sl276\slmult1\sb0\sa140{\listtext\pard\plain 3.\tab}\ilvl0\ls1 \li0\ri0\lin0\rin0\fi0\widctlpar\tx707\li707\ri0\lin707\rin0\fi0\sb0\sa0{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
Launch FF, click on the browse button and locate the default.xbe file you transferred over.\~ Click open.}
\par \pard\plain \s19\sl276\slmult1\sb0\sa140{\listtext\pard\plain 4.\tab}\ilvl0\ls1 \li0\ri0\lin0\rin0\fi0\widctlpar\tx707\li707\ri0\lin707\rin0\fi0\sb0\sa0{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
Select the desired amount of flicker filter you'd like the game to have.\~ Off is a good choice for first time usage, as you will then be able to instantly verify that the patch worked properly.\~ The difference between 1 and 5 is rather subtle.}
\par \pard\plain \s19\sl276\slmult1\sb0\sa140{\listtext\pard\plain 5.\tab}\ilvl0\ls1 \li0\ri0\lin0\rin0\fi0\widctlpar\tx707\li707\ri0\lin707\rin0\fi0\sb0\sa0{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
Press the "Patch it!" button.}
\par \pard\plain \s19\sl276\slmult1\sb0\sa140{\listtext\pard\plain 6.\tab}\ilvl0\ls1 \li0\ri0\lin0\rin0\fi0\widctlpar\tx707\li707\ri0\lin707\rin0\fi0\sb0\sa0{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
FF will then load, analyse and display the available patches that can be made (if any) to this xbe file.\line Since FF is a generic utility, it may find multiple instances of FlickerFilter code to be patched.\~ Not all of them will be required to be patched to change the setting in the game, but there is no way to know until you try them.\~ There should be no harm in patching every instance, but the option is there to skip a patch if it ever causes trouble.}
\par \pard\plain \s19\sl276\slmult1\sb0\sa140{\listtext\pard\plain 7.\tab}\ilvl0\ls1 \li0\ri0\lin0\rin0\fi0\widctlpar\tx707\li707\ri0\lin707\rin0\fi0\sb0\sa0{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
Select yes or no to the patches listed.\~ The first time a game is tried, it is suggested to allow FF to patch everything.}
\par \pard\plain \s19\sl276\slmult1\sb0\sa140{\listtext\pard\plain 8.\tab}\ilvl0\ls1 \li0\ri0\lin0\rin0\fi0\widctlpar\tx707\li707\ri0\lin707\rin0\fi0\sb0\sa0{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
Check the output messages to verify that the file was successfully patched and saved.}
\par \pard\plain \s19\sl276\slmult1\sb0\sa140{\listtext\pard\plain 9.\tab}\ilvl0\ls1 \li0\ri0\lin0\rin0\fi0\widctlpar\tx707\li707\ri0\lin707\rin0\fi0{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
FTP the patched default.xbe back to your xbox and try it.\~}
\par \pard\plain \s19\sl276\slmult1\sb0\sa140\widctlpar\li0\ri0\lin0\rin0\fi0{\rtlch \ltrch\loch
\line \line }{\cs16\b\ab\scaps0\caps0\cf1\expnd0\expndtw0\i0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
Technical Details\~}{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
(warning, geeky stuff ahead)}{\rtlch \ltrch\loch
\line \line }{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
FF can patch up to 4 different types of calls to the SetFlickerFilter routine.}{\rtlch \ltrch\loch
\line }{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
Since FF is a generic patch utility, and not all executables are compiled the same, FF had to be smart enough to examine different types of calls made to SetFlickerFilter, and be able to modify their behaviour without causing the code to crash.}{\rtlch \ltrch\loch
\line \line }{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
Currently, there are 4 different types of calls known, which covers all the xbe titles tested.\~ As more titles are tested, it is quite possible that more will be added in future releases.}{\rtlch \ltrch\loch
\line \line \line }{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
Type 1 - the simplest type of patch.\~ FlickerFilter parameters are simply passed on the stack as static values.}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar\li0\ri0\lin0\rin0\fi0{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
.text:0031DE65\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ test\~\~\~ eax, eax}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
.text:0031DE67\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ push\~\~\~ esi}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
.text:0031DE68\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ mov\~\~\~\~ esi, ds:AvSendTVEncoderOption}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
.text:0031DE6E\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ jz\~\~\~\~\~ short loc_31DE79}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
.text:0031DE70\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ cmp\~\~\~\~ ds:dword_3D9284, 5}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
.text:0031DE77\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ }{\scaps0\caps0\cf5\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
jz\~\~\~\~\~ short loc_31DEA1}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
.text:0031DE79 }
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
.text:0031DE79 loc_31DE79:\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ }
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
.text:0031DE79\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ mov\~\~\~\~ eax, ds:dword_3D83C8 ; opcodes:}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
.text:0031DE7E\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ mov\~\~\~\~ ecx, \{eax+1C28h\} \~\~ \~\~\~ ; 8b 88 ...}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
.text:0031DE84\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ push\~\~\~ 0\~\~\~ \~\~\~ \~\~\~ ; 6a 00}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
.text:0031DE86\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ push\~\~\~ }{\scaps0\caps0\cf2\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
5}{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
\~\~\~ \~\~\~ \~\~\~ ; 6a 05}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
.text:0031DE88\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ push\~\~\~ 0Bh\~\~\~ \~\~\~ \~ ; 6a 0b}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
.text:0031DE8A\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ push\~\~\~ ecx\~\~\~ \~\~\~ \~ ; 51}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
.text:0031DE8B\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ call\~\~\~ esi\~\~\~ \~\~\~ \~\~\~ ; ff d6}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
.text:0031DE8D\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ mov\~\~\~\~ ds:dword_3D928C, 1}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar\sb0\sa283{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs24
.text:0031DE97\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ mov\~\~\~\~ ds:dword_3D9284, 5}
\par \pard\plain \s19\sl276\slmult1\sb0\sa140\widctlpar\li0\ri0\lin0\rin0\fi0{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
All FF does here is change the blue-highlighted 5 into the value the user selects from the dropdown list.}{\rtlch \ltrch\loch
\line }{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
FF also removes the conditional jump statement above the patch to ensure the patch is always executed.}{\rtlch \ltrch\loch
\line \line \line \line }{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
type 2 - register is being used to pass value into FlickerFilter call (see blue line)}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar\li0\ri0\lin0\rin0\fi0{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003C82B6\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ test\~\~\~ ecx, ecx}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003C82B8\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ mov\~\~\~\~ eax, ds:dword_3D83C8}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003C82BD\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ }{\scaps0\caps0\cf5\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
jz\~\~\~\~\~ short loc_3C82C7}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003C82BF\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ cmp\~\~\~\~ ds:dword_3D9284, esi}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003C82C5\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ }{\scaps0\caps0\cf5\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
jz\~\~\~\~\~ short locret_3C82E9}{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
\~\~\~ ; 74 22}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003C82C7 }
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003C82C7 loc_3C82C7:\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ }
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003C82C7\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ mov\~\~\~\~ eax, \{eax+1C28h\} \~\~ \~\~\~ ; 8b 80 ..}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003C82CD\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ push\~\~\~ 0\~\~\~ \~\~ \~\~\~ \~\~\~ ; 6a 00}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003C82CF\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ }{\scaps0\caps0\cf2\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
push\~\~\~ esi\~}{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
\~\~ \~\~\~ \~\~\~ ; 56}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003C82D0\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ push\~\~\~ 0Bh\~\~\~ \~\~\~ \~\~\~ ; 6a 0b}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003C82D2\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ push\~\~\~ eax\~\~\~ \~\~\~ \~\~\~ ; 50}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003C82D3\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ call\~\~\~ ds:AvSendTVEncoderOption\~\~ ; ff 15}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003C82D9\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ mov\~\~\~\~ ds:dword_3D928C, 1}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar\sb0\sa283{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003C82E3\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ mov\~\~\~\~ ds:dword_3D9284, esi}
\par \pard\plain \s19\sl276\slmult1\sb0\sa140\widctlpar\li0\ri0\lin0\rin0\fi0{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
FF first removes the conditional jump statements above the patch to ensure the patch is always executed.}{\rtlch \ltrch\loch
\line \line }{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
In this case, FF must relocate the "push 0" statement to where the 2nd conditional jump was removed.\~ This frees up the space needed to do a direct passing of the user selected flicker filter parameter in place of that "push esi"}{\rtlch \ltrch\loch
\line \line }{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
The topmost conditional jump must be removed to ensure the stack is properly set up prior to the call, otherwise the jump could have skipped over the push 0 we just located into the bytes used by the 2nd conditional jump.\~ naughty.}{\rtlch \ltrch\loch
\line \line \line }{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
type 3 - very similar to type 2, except there is no direct "push 0" statement at the top of the call routine.}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar\li0\ri0\lin0\rin0\fi0{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003CC02B\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ jnz\~\~\~\~ short loc_3CBFF0}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003CC02D\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ mov\~\~\~\~ esi, \{esp+28h+arg_0\}}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003CC031\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ mov\~\~\~\~ eax, \{esi+1DDCh\}}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003CC037\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ mov\~\~\~\~ ebx, ds:AvSendTVEncoderOption}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003CC03D\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ xor\~\~\~\~ ebp, ebp}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003CC03F\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ test\~\~\~ eax, 1000000h}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003CC044\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ }{\scaps0\caps0\cf5\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
jz\~\~\~\~\~ short loc_3CC053}{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
\~\~\~ ; 74 0d}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003CC046\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ mov\~\~\~\~ edx, \{esi+1C28h\} \~\~ ; 8b 96 . . .}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003CC04C\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ }{\scaps0\caps0\cf2\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
push\~\~\~ ebp\~}{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
\~\~ ; 55}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003CC04D\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ }{\scaps0\caps0\cf2\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
push\~\~\~ ebp}{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
\~\~\~ ; 55}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003CC04E\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ push\~\~\~ 0Bh\~\~\~ ; 6a 0b}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003CC050\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ push\~\~\~ edx \~\~ ; 52}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar\sb0\sa283{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:003CC051\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ call\~\~\~ ebx\~\~\~ ; ff d3}
\par \pard\plain \s19\sl276\slmult1\sb0\sa140\widctlpar\li0\ri0\lin0\rin0\fi0{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
FF first removes the conditional jump, as always, and then relocates the first push statement into the freed bytes.\line FF then adds a direct "push \{userValue\}" to the 2 bytes freed up by relocating the first push.\line \line Type 4 - very similar to type 3, except there's an extra statement before the pushing begins.}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar\li0\ri0\lin0\rin0\fi0{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:00168F1F\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ call\~\~\~ ds:AvSetDisplayMode}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:00168F25\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ mov\~\~\~\~ esi, eax}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:00168F27\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ test\~\~\~ esi, esi}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:00168F29\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ jnz\~\~\~\~ short loc_168F08}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:00168F2B\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ test\~\~\~ dword ptr \{edi+1DDCh\}, 1000000h}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:00168F35\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ mov\~\~\~\~ ebx, ds:AvSendTVEncoderOption}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:00168F3B\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ }{\scaps0\caps0\cf5\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
jz\~\~\~\~\~ short loc_168F4E}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:00168F3D\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ mov\~\~\~\~ ecx, \{edi+1C28h\}}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:00168F43\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ xor\~\~\~\~ ebp, ebp}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:00168F45\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ push\~\~\~ ebp}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:00168F46\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ push\~\~\~ ebp}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:00168F47\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ push\~\~\~ 0Bh}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:00168F49\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ push\~\~\~ ecx}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:00168F4A\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ call\~\~\~ ebx}
\par \pard\plain \s23\sb0\sa0\dbch\af8\dbch\af6\afs20\loch\f6\fs20\widctlpar\sb0\sa283{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch
D3D:00168F4C\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~ jmp\~\~\~\~ short loc_168F50}
\par \pard\plain \s19\sl276\slmult1\sb0\sa140\widctlpar\li0\ri0\lin0\rin0\fi0{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
FF must first remove the conditional jump, then deal with the extra opcodes (in this case the "xor ebp, ebp") in order to make room for the push \{flickerValue\} statement that has to be inserted. "xor exp,ebp" is relocated to the conditional jump bytes, and the pushes slid up to make room for the additional byte required to push a static value.\~ this is the worst type of patch so far.\line }
\par \pard\plain \s19\sl276\slmult1\sb0\sa140\widctlpar\li0\ri0\lin0\rin0\fi0{\scaps0\caps0\cf1\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs28\loch\f5\hich\af5
Thanks to IDA for the disassembly.\line \line \line release history:\~\line 007 - fixed bug in patch type 4-the conditional jump removal was a little too aggressive and removed jumps that were actually MOV's ;)\~\line 006 - first public release}
\par \pard\plain \s0\widctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af9\afs24\alang1081\loch\f3\hich\af3\fs24\lang4105\li-850\ri0\lin-850\rin0\fi0\rtlch \ltrch\loch
\par }