├── .gitignore ├── DelimStringReader.h ├── III └── audio-samples.ini ├── LICENSE ├── Patterns.cpp ├── Patterns.h ├── README.md ├── VC └── audio-samples.ini ├── audio_samples.rc ├── audio_samples.sln ├── audio_samples.vcxproj ├── audio_samples.vcxproj.filters ├── dllmain.cpp └── resource.h /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.sln.docstates 8 | 9 | # Build results 10 | [Dd]ebug/ 11 | [Dd]ebugPublic/ 12 | [Rr]elease/ 13 | [Nn]ormal/ 14 | [Nn]ightly/ 15 | output/ 16 | symbols/ 17 | x64/ 18 | x86/ 19 | build/ 20 | bld/ 21 | [Bb]in/ 22 | [Oo]bj/ 23 | 24 | # MSTest test Results 25 | [Tt]est[Rr]esult*/ 26 | [Bb]uild[Ll]og.* 27 | 28 | #NUNIT 29 | *.VisualState.xml 30 | TestResult.xml 31 | 32 | *.cso 33 | *_i.c 34 | *_p.c 35 | *_i.h 36 | *.ilk 37 | *.meta 38 | *.obj 39 | *.pch 40 | *.pdb 41 | *.pgc 42 | *.pgd 43 | *.rsp 44 | *.sbr 45 | *.tlb 46 | *.tli 47 | *.tlh 48 | *.tmp 49 | *.tmp_proj 50 | *.log 51 | *.vspscc 52 | *.vssscc 53 | .builds 54 | *.pidb 55 | *.svclog 56 | *.scc 57 | 58 | # Chutzpah Test files 59 | _Chutzpah* 60 | 61 | # Visual C++ cache files 62 | ipch/ 63 | *.aps 64 | *.ncb 65 | *.opensdf 66 | *.sdf 67 | *.db 68 | *.opendb 69 | *.cachefile 70 | 71 | # Visual Studio profiler 72 | *.psess 73 | *.vsp 74 | *.vspx 75 | 76 | # TFS 2012 Local Workspace 77 | $tf/ 78 | 79 | # Guidance Automation Toolkit 80 | *.gpState 81 | 82 | # ReSharper is a .NET coding add-in 83 | _ReSharper*/ 84 | *.[Rr]e[Ss]harper 85 | *.DotSettings.user 86 | 87 | # JustCode is a .NET coding addin-in 88 | .JustCode 89 | 90 | # TeamCity is a build add-in 91 | _TeamCity* 92 | 93 | # DotCover is a Code Coverage Tool 94 | *.dotCover 95 | 96 | # NCrunch 97 | *.ncrunch* 98 | _NCrunch_* 99 | .*crunch*.local.xml 100 | 101 | # MightyMoose 102 | *.mm.* 103 | AutoTest.Net/ 104 | 105 | # Web workbench (sass) 106 | .sass-cache/ 107 | 108 | # Installshield output folder 109 | [Ee]xpress/ 110 | 111 | # DocProject is a documentation generator add-in 112 | DocProject/buildhelp/ 113 | DocProject/Help/*.HxT 114 | DocProject/Help/*.HxC 115 | DocProject/Help/*.hhc 116 | DocProject/Help/*.hhk 117 | DocProject/Help/*.hhp 118 | DocProject/Help/Html2 119 | DocProject/Help/html 120 | 121 | # Click-Once directory 122 | publish/ 123 | 124 | # Publish Web Output 125 | *.[Pp]ublish.xml 126 | *.azurePubxml 127 | 128 | # NuGet Packages Directory 129 | ## TODO: If you have NuGet Package Restore enabled, uncomment the next line 130 | #packages/* 131 | ## TODO: If the tool you use requires repositories.config, also uncomment the next line 132 | #!packages/repositories.config 133 | 134 | # Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets 135 | # This line needs to be after the ignore of the build folder (and the packages folder if the line above has been uncommented) 136 | !packages/build/ 137 | 138 | # Windows Azure Build Output 139 | csx/ 140 | *.build.csdef 141 | 142 | # Windows Store app package directory 143 | AppPackages/ 144 | 145 | # Others 146 | sql/ 147 | *.Cache 148 | ClientBin/ 149 | [Ss]tyle[Cc]op.* 150 | ~$* 151 | *~ 152 | *.dbmdl 153 | *.dbproj.schemaview 154 | *.pfx 155 | *.publishsettings 156 | node_modules/ 157 | 158 | # RIA/Silverlight projects 159 | Generated_Code/ 160 | 161 | # Backup & report files from converting an old project file to a newer 162 | # Visual Studio version. Backup files are not needed, because we have git ;-) 163 | _UpgradeReport_Files/ 164 | Backup*/ 165 | UpgradeLog*.XML 166 | UpgradeLog*.htm 167 | 168 | # SQL Server files 169 | App_Data/*.mdf 170 | App_Data/*.ldf 171 | 172 | # Business Intelligence projects 173 | *.rdl.data 174 | *.bim.layout 175 | *.bim_*.settings 176 | 177 | # Microsoft Fakes 178 | FakesAssemblies/ 179 | 180 | # ========================= 181 | # Windows detritus 182 | # ========================= 183 | 184 | # Windows image file caches 185 | Thumbs.db 186 | ehthumbs.db 187 | 188 | # Folder config file 189 | Desktop.ini 190 | 191 | # Recycle Bin used on file shares 192 | $RECYCLE.BIN/ 193 | -------------------------------------------------------------------------------- /DelimStringReader.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | template 4 | class BasicDelimStringReader 5 | { 6 | public: 7 | BasicDelimStringReader( size_t size ) 8 | : m_buffer( new T[size] ), m_size( size ) 9 | { 10 | Reset(); 11 | } 12 | 13 | ~BasicDelimStringReader() 14 | { 15 | delete[] m_buffer; 16 | } 17 | 18 | inline T* GetBuffer() const 19 | { 20 | return m_buffer; 21 | } 22 | 23 | inline size_t GetSize() const 24 | { 25 | return m_size; 26 | } 27 | 28 | const T* GetString( size_t* size = nullptr ) 29 | { 30 | if ( *m_cursor == '\0' ) 31 | { 32 | if ( size != nullptr ) *size = 0; 33 | return nullptr; 34 | } 35 | const T* curString = m_cursor; 36 | size_t len = 0; 37 | 38 | while ( *m_cursor++ != '\0' ) len++; 39 | 40 | if ( size != nullptr ) *size = len; 41 | return curString; 42 | } 43 | 44 | inline void Reset() 45 | { 46 | m_cursor = m_buffer; 47 | } 48 | 49 | private: 50 | T* const m_buffer; 51 | const T* m_cursor; 52 | const size_t m_size; 53 | }; 54 | 55 | typedef BasicDelimStringReader DelimStringReader; 56 | typedef BasicDelimStringReader WideDelimStringReader; -------------------------------------------------------------------------------- /III/audio-samples.ini: -------------------------------------------------------------------------------- 1 | [Samples] 2 | AUDIO\HEAD.WAV 3 | AUDIO\CLASS.WAV 4 | AUDIO\KJAH.WAV 5 | AUDIO\RISE.WAV 6 | AUDIO\LIPS.WAV 7 | AUDIO\GAME.WAV 8 | AUDIO\MSX.WAV 9 | AUDIO\FLASH.WAV 10 | AUDIO\CHAT.WAV 11 | AUDIO\HEAD.WAV 12 | AUDIO\POLICE.WAV 13 | AUDIO\CITY.WAV 14 | AUDIO\WATER.WAV 15 | AUDIO\COMOPEN.WAV 16 | AUDIO\SUBOPEN.WAV 17 | AUDIO\JB.MP3 18 | AUDIO\BET.MP3 19 | AUDIO\L1_LG.MP3 20 | AUDIO\L2_DSB.MP3 21 | AUDIO\L3_DM.MP3 22 | AUDIO\L4_PAP.MP3 23 | AUDIO\L5_TFB.MP3 24 | AUDIO\J0_DM2.MP3 25 | AUDIO\J1_LFL.MP3 26 | AUDIO\J2_KCL.MP3 27 | AUDIO\J3_VH.MP3 28 | AUDIO\J4_ETH.MP3 29 | AUDIO\J5_DST.MP3 30 | AUDIO\J6_TBJ.MP3 31 | AUDIO\T1_TOL.MP3 32 | AUDIO\T2_TPU.MP3 33 | AUDIO\T3_MAS.MP3 34 | AUDIO\T4_TAT.MP3 35 | AUDIO\T5_BF.MP3 36 | AUDIO\S0_MAS.MP3 37 | AUDIO\S1_PF.MP3 38 | AUDIO\S2_CTG.MP3 39 | AUDIO\S3_RTC.MP3 40 | AUDIO\S5_LRQ.MP3 41 | AUDIO\S4_BDBA.MP3 42 | AUDIO\S4_BDBB.MP3 43 | AUDIO\S2_CTG2.MP3 44 | AUDIO\S4_BDBD.MP3 45 | AUDIO\S5_LRQB.MP3 46 | AUDIO\S5_LRQC.MP3 47 | AUDIO\A1_SSO.WAV 48 | AUDIO\A2_PP.WAV 49 | AUDIO\A3_SS.WAV 50 | AUDIO\A4_PDR.WAV 51 | AUDIO\A5_K2FT.WAV 52 | AUDIO\K1_KBO.MP3 53 | AUDIO\K2_GIS.MP3 54 | AUDIO\K3_DS.MP3 55 | AUDIO\K4_SHI.MP3 56 | AUDIO\K5_SD.MP3 57 | AUDIO\R0_PDR2.MP3 58 | AUDIO\R1_SW.MP3 59 | AUDIO\R2_AP.MP3 60 | AUDIO\R3_ED.MP3 61 | AUDIO\R4_GF.MP3 62 | AUDIO\R5_PB.MP3 63 | AUDIO\R6_MM.MP3 64 | AUDIO\D1_STOG.MP3 65 | AUDIO\D2_KK.MP3 66 | AUDIO\D3_ADO.MP3 67 | AUDIO\D5_ES.MP3 68 | AUDIO\D7_MLD.MP3 69 | AUDIO\D4_GTA.MP3 70 | AUDIO\D4_GTA2.MP3 71 | AUDIO\D6_STS.MP3 72 | AUDIO\A6_BAIT.WAV 73 | AUDIO\A7_ETG.WAV 74 | AUDIO\A8_PS.WAV 75 | AUDIO\A9_ASD.WAV 76 | AUDIO\K4_SHI2.MP3 77 | AUDIO\C1_TEX.MP3 78 | AUDIO\EL_PH1.MP3 79 | AUDIO\EL_PH2.MP3 80 | AUDIO\EL_PH3.MP3 81 | AUDIO\EL_PH4.MP3 82 | AUDIO\YD_PH1.MP3 83 | AUDIO\YD_PH2.MP3 84 | AUDIO\YD_PH3.MP3 85 | AUDIO\YD_PH4.MP3 86 | AUDIO\HD_PH1.MP3 87 | AUDIO\HD_PH2.MP3 88 | AUDIO\HD_PH3.MP3 89 | AUDIO\HD_PH4.MP3 90 | AUDIO\HD_PH5.MP3 91 | AUDIO\MT_PH1.MP3 92 | AUDIO\MT_PH2.MP3 93 | AUDIO\MT_PH3.MP3 94 | AUDIO\MT_PH4.MP3 95 | AUDIO\MISCOM.WAV 96 | AUDIO\END.MP3 97 | AUDIO\lib_a1.WAV 98 | AUDIO\lib_a2.WAV 99 | AUDIO\lib_a.WAV 100 | AUDIO\lib_b.WAV 101 | AUDIO\lib_c.WAV 102 | AUDIO\lib_d.WAV 103 | AUDIO\l2_a.WAV 104 | AUDIO\j4t_1.WAV 105 | AUDIO\j4t_2.WAV 106 | AUDIO\j4t_3.WAV 107 | AUDIO\j4t_4.WAV 108 | AUDIO\j4_a.WAV 109 | AUDIO\j4_b.WAV 110 | AUDIO\j4_c.WAV 111 | AUDIO\j4_d.WAV 112 | AUDIO\j4_e.WAV 113 | AUDIO\j4_f.WAV 114 | AUDIO\j6_1.WAV 115 | AUDIO\j6_a.WAV 116 | AUDIO\j6_b.WAV 117 | AUDIO\j6_c.WAV 118 | AUDIO\j6_d.WAV 119 | AUDIO\t4_a.WAV 120 | AUDIO\s1_a.WAV 121 | AUDIO\s1_a1.WAV 122 | AUDIO\s1_b.WAV 123 | AUDIO\s1_c.WAV 124 | AUDIO\s1_c1.WAV 125 | AUDIO\s1_d.WAV 126 | AUDIO\s1_e.WAV 127 | AUDIO\s1_f.WAV 128 | AUDIO\s1_g.WAV 129 | AUDIO\s1_h.WAV 130 | AUDIO\s1_i.WAV 131 | AUDIO\s1_j.WAV 132 | AUDIO\s1_k.WAV 133 | AUDIO\s1_l.WAV 134 | AUDIO\s3_a.WAV 135 | AUDIO\s3_b.WAV 136 | AUDIO\el3_a.WAV 137 | AUDIO\mf1_a.WAV 138 | AUDIO\mf2_a.WAV 139 | AUDIO\mf3_a.WAV 140 | AUDIO\mf3_b.WAV 141 | AUDIO\mf3_b1.WAV 142 | AUDIO\mf3_c.WAV 143 | AUDIO\mf4_a.WAV 144 | AUDIO\mf4_b.WAV 145 | AUDIO\mf4_c.WAV 146 | AUDIO\a1_a.WAV 147 | AUDIO\a3_a.WAV 148 | AUDIO\a5_a.WAV 149 | AUDIO\a4_a.WAV 150 | AUDIO\a4_b.WAV 151 | AUDIO\a4_c.WAV 152 | AUDIO\a4_d.WAV 153 | AUDIO\k1_a.WAV 154 | AUDIO\k3_a.WAV 155 | AUDIO\r1_a.WAV 156 | AUDIO\r2_a.WAV 157 | AUDIO\r2_b.WAV 158 | AUDIO\r2_c.WAV 159 | AUDIO\r2_d.WAV 160 | AUDIO\r2_e.WAV 161 | AUDIO\r2_f.WAV 162 | AUDIO\r2_g.WAV 163 | AUDIO\r2_h.WAV 164 | AUDIO\r5_a.WAV 165 | AUDIO\r6_a.WAV 166 | AUDIO\r6_a1.WAV 167 | AUDIO\r6_b.WAV 168 | AUDIO\lo2_a.WAV 169 | AUDIO\lo6_a.WAV 170 | AUDIO\yd2_a.WAV 171 | AUDIO\yd2_b.WAV 172 | AUDIO\yd2_c.WAV 173 | AUDIO\yd2_c1.WAV 174 | AUDIO\yd2_d.WAV 175 | AUDIO\yd2_e.WAV 176 | AUDIO\yd2_f.WAV 177 | AUDIO\yd2_g.WAV 178 | AUDIO\yd2_h.WAV 179 | AUDIO\yd2_ass.WAV 180 | AUDIO\yd2_ok.WAV 181 | AUDIO\h5_a.WAV 182 | AUDIO\h5_b.WAV 183 | AUDIO\h5_c.WAV 184 | AUDIO\ammu_a.WAV 185 | AUDIO\ammu_b.WAV 186 | AUDIO\ammu_c.WAV 187 | AUDIO\door_1.WAV 188 | AUDIO\door_2.WAV 189 | AUDIO\door_3.WAV 190 | AUDIO\door_4.WAV 191 | AUDIO\door_5.WAV 192 | AUDIO\door_6.WAV 193 | AUDIO\t3_a.WAV 194 | AUDIO\t3_b.WAV 195 | AUDIO\t3_c.WAV 196 | AUDIO\k1_b.WAV 197 | AUDIO\cat1.WAV 198 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Adrian Zdanowicz (Silent) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Patterns.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the CitizenFX project - http://citizen.re/ 3 | * 4 | * See LICENSE and MENTIONS in the root of the source tree for information 5 | * regarding licensing. 6 | */ 7 | 8 | #include "Patterns.h" 9 | 10 | #define WIN32_LEAN_AND_MEAN 11 | #define NOMINMAX 12 | #include 13 | #include 14 | #include 15 | 16 | #if PATTERNS_USE_HINTS 17 | #include 18 | #endif 19 | 20 | 21 | #if PATTERNS_USE_HINTS 22 | 23 | // from boost someplace 24 | template 25 | struct basic_fnv_1 26 | { 27 | std::uint64_t operator()(std::string_view text) const 28 | { 29 | std::uint64_t hash = OffsetBasis; 30 | for (auto it : text) 31 | { 32 | hash *= FnvPrime; 33 | hash ^= it; 34 | } 35 | 36 | return hash; 37 | } 38 | }; 39 | 40 | const std::uint64_t fnv_prime = 1099511628211u; 41 | const std::uint64_t fnv_offset_basis = 14695981039346656037u; 42 | 43 | typedef basic_fnv_1 fnv_1; 44 | 45 | #endif 46 | 47 | namespace hook 48 | { 49 | ptrdiff_t baseAddressDifference; 50 | 51 | // sets the base to the process main base 52 | void set_base() 53 | { 54 | set_base((uintptr_t)GetModuleHandle(nullptr)); 55 | } 56 | 57 | 58 | #if PATTERNS_USE_HINTS 59 | static std::multimap g_hints; 60 | #endif 61 | 62 | static void TransformPattern(std::string_view pattern, std::string& data, std::string& mask) 63 | { 64 | uint8_t tempDigit = 0; 65 | bool tempFlag = false; 66 | 67 | auto tol = [] (char ch) -> uint8_t 68 | { 69 | if (ch >= 'A' && ch <= 'F') return uint8_t(ch - 'A' + 10); 70 | if (ch >= 'a' && ch <= 'f') return uint8_t(ch - 'a' + 10); 71 | return uint8_t(ch - '0'); 72 | }; 73 | 74 | for (auto ch : pattern) 75 | { 76 | if (ch == ' ') 77 | { 78 | continue; 79 | } 80 | else if (ch == '?') 81 | { 82 | data.push_back(0); 83 | mask.push_back('?'); 84 | } 85 | else if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f')) 86 | { 87 | uint8_t thisDigit = tol(ch); 88 | 89 | if (!tempFlag) 90 | { 91 | tempDigit = thisDigit << 4; 92 | tempFlag = true; 93 | } 94 | else 95 | { 96 | tempDigit |= thisDigit; 97 | tempFlag = false; 98 | 99 | data.push_back(tempDigit); 100 | mask.push_back('x'); 101 | } 102 | } 103 | } 104 | } 105 | 106 | class executable_meta 107 | { 108 | private: 109 | uintptr_t m_begin; 110 | uintptr_t m_end; 111 | 112 | public: 113 | template 114 | TReturn* getRVA(TOffset rva) 115 | { 116 | return (TReturn*)(m_begin + rva); 117 | } 118 | 119 | explicit executable_meta(void* module) 120 | : m_begin((uintptr_t)module) 121 | { 122 | PIMAGE_DOS_HEADER dosHeader = getRVA(0); 123 | PIMAGE_NT_HEADERS ntHeader = getRVA(dosHeader->e_lfanew); 124 | 125 | m_end = m_begin + ntHeader->OptionalHeader.SizeOfCode; 126 | } 127 | 128 | executable_meta(uintptr_t begin, uintptr_t end) 129 | : m_begin(begin), m_end(end) 130 | { 131 | } 132 | 133 | inline uintptr_t begin() const { return m_begin; } 134 | inline uintptr_t end() const { return m_end; } 135 | }; 136 | 137 | void pattern::Initialize(const char* pattern, size_t length) 138 | { 139 | // get the hash for the base pattern 140 | #if PATTERNS_USE_HINTS 141 | m_hash = fnv_1()(std::string_view(pattern, length)); 142 | #endif 143 | 144 | // transform the base pattern from IDA format to canonical format 145 | TransformPattern(std::string_view(pattern, length), m_bytes, m_mask); 146 | 147 | #if PATTERNS_USE_HINTS 148 | // if there's hints, try those first 149 | if (m_module == GetModuleHandle(nullptr)) 150 | { 151 | auto range = g_hints.equal_range(m_hash); 152 | 153 | if (range.first != range.second) 154 | { 155 | std::for_each(range.first, range.second, [&] (const std::pair& hint) 156 | { 157 | ConsiderMatch(hint.second); 158 | }); 159 | 160 | // if the hints succeeded, we don't need to do anything more 161 | if (!m_matches.empty()) 162 | { 163 | m_matched = true; 164 | return; 165 | } 166 | } 167 | } 168 | #endif 169 | } 170 | 171 | void pattern::EnsureMatches(uint32_t maxCount) 172 | { 173 | if (m_matched) 174 | { 175 | return; 176 | } 177 | 178 | // scan the executable for code 179 | executable_meta executable = m_rangeStart != 0 && m_rangeEnd != 0 ? executable_meta(m_rangeStart, m_rangeEnd) : executable_meta(m_module); 180 | 181 | auto matchSuccess = [&] (uintptr_t address) 182 | { 183 | #if PATTERNS_USE_HINTS 184 | g_hints.emplace(m_hash, address); 185 | #else 186 | (void)address; 187 | #endif 188 | 189 | return (m_matches.size() == maxCount); 190 | }; 191 | 192 | const uint8_t* pattern = reinterpret_cast(m_bytes.c_str()); 193 | const char* mask = m_mask.c_str(); 194 | size_t maskSize = m_mask.size(); 195 | size_t lastWild = m_mask.find_last_of('?'); 196 | 197 | ptrdiff_t Last[256]; 198 | 199 | std::fill(std::begin(Last), std::end(Last), lastWild == std::string::npos ? -1 : static_cast(lastWild) ); 200 | 201 | for ( ptrdiff_t i = 0; i < static_cast(maskSize); ++i ) 202 | { 203 | if ( Last[ pattern[i] ] < i ) 204 | { 205 | Last[ pattern[i] ] = i; 206 | } 207 | } 208 | 209 | for (uintptr_t i = executable.begin(), end = executable.end() - maskSize; i <= end;) 210 | { 211 | uint8_t* ptr = reinterpret_cast(i); 212 | ptrdiff_t j = maskSize - 1; 213 | 214 | while((j >= 0) && (mask[j] == '?' || pattern[j] == ptr[j])) j--; 215 | 216 | if(j < 0) 217 | { 218 | m_matches.emplace_back(ptr); 219 | 220 | if (matchSuccess(i)) 221 | { 222 | break; 223 | } 224 | i++; 225 | } 226 | else i += std::max(ptrdiff_t(1), j - Last[ ptr[j] ]); 227 | } 228 | 229 | m_matched = true; 230 | } 231 | 232 | bool pattern::ConsiderMatch(uintptr_t offset) 233 | { 234 | const char* pattern = m_bytes.c_str(); 235 | const char* mask = m_mask.c_str(); 236 | 237 | char* ptr = reinterpret_cast(offset); 238 | 239 | for (size_t i = 0, j = m_mask.size(); i < j; i++) 240 | { 241 | if (mask[i] == '?') 242 | { 243 | continue; 244 | } 245 | 246 | if (pattern[i] != ptr[i]) 247 | { 248 | return false; 249 | } 250 | } 251 | 252 | m_matches.emplace_back(ptr); 253 | 254 | return true; 255 | } 256 | 257 | #if PATTERNS_USE_HINTS 258 | void pattern::hint(uint64_t hash, uintptr_t address) 259 | { 260 | auto range = g_hints.equal_range(hash); 261 | 262 | for (auto it = range.first; it != range.second; it++) 263 | { 264 | if (it->second == address) 265 | { 266 | return; 267 | } 268 | } 269 | 270 | g_hints.emplace(hash, address); 271 | } 272 | #endif 273 | } -------------------------------------------------------------------------------- /Patterns.h: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the CitizenFX project - http://citizen.re/ 3 | * 4 | * See LICENSE and MENTIONS in the root of the source tree for information 5 | * regarding licensing. 6 | */ 7 | 8 | #pragma once 9 | 10 | #include 11 | #include 12 | 13 | #pragma warning(push) 14 | #pragma warning(disable:4201) 15 | 16 | #define PATTERNS_USE_HINTS 0 17 | 18 | namespace hook 19 | { 20 | extern ptrdiff_t baseAddressDifference; 21 | 22 | // sets the base address difference based on an obtained pointer 23 | inline void set_base(uintptr_t address) 24 | { 25 | #ifdef _M_IX86 26 | uintptr_t addressDiff = (address - 0x400000); 27 | #elif defined(_M_AMD64) 28 | uintptr_t addressDiff = (address - 0x140000000); 29 | #endif 30 | 31 | // pointer-style cast to ensure unsigned overflow ends up copied directly into a signed value 32 | baseAddressDifference = *(ptrdiff_t*)&addressDiff; 33 | } 34 | 35 | // sets the base to the process main base 36 | void set_base(); 37 | 38 | template 39 | inline T* getRVA(uintptr_t rva) 40 | { 41 | set_base(); 42 | #ifdef _M_IX86 43 | return (T*)(baseAddressDifference + 0x400000 + rva); 44 | #elif defined(_M_AMD64) 45 | return (T*)(0x140000000 + rva); 46 | #endif 47 | } 48 | 49 | class pattern_match 50 | { 51 | private: 52 | void* m_pointer; 53 | 54 | public: 55 | inline pattern_match(void* pointer) 56 | : m_pointer(pointer) 57 | { 58 | } 59 | 60 | template 61 | T* get(ptrdiff_t offset = 0) const 62 | { 63 | char* ptr = reinterpret_cast(m_pointer); 64 | return reinterpret_cast(ptr + offset); 65 | } 66 | }; 67 | 68 | class pattern 69 | { 70 | private: 71 | std::string m_bytes; 72 | std::string m_mask; 73 | 74 | #if PATTERNS_USE_HINTS 75 | uint64_t m_hash; 76 | #endif 77 | 78 | std::vector m_matches; 79 | 80 | bool m_matched; 81 | 82 | union 83 | { 84 | void* m_module; 85 | struct 86 | { 87 | uintptr_t m_rangeStart; 88 | uintptr_t m_rangeEnd; 89 | }; 90 | }; 91 | 92 | protected: 93 | inline pattern(void* module) 94 | : m_module(module), m_rangeEnd(0), m_matched(false) 95 | { 96 | } 97 | 98 | inline pattern(uintptr_t begin, uintptr_t end) 99 | : m_rangeStart(begin), m_rangeEnd(end), m_matched(false) 100 | { 101 | } 102 | 103 | void Initialize(const char* pattern, size_t length); 104 | 105 | private: 106 | bool ConsiderMatch(uintptr_t offset); 107 | 108 | void EnsureMatches(uint32_t maxCount); 109 | 110 | inline pattern_match _get_internal(size_t index) const 111 | { 112 | return m_matches[index]; 113 | } 114 | 115 | public: 116 | template 117 | pattern(const char (&pattern)[Len]) 118 | : pattern(getRVA(0)) 119 | { 120 | Initialize(pattern, Len-1); 121 | } 122 | 123 | inline pattern& count(uint32_t expected) & 124 | { 125 | EnsureMatches(expected); 126 | assert(m_matches.size() == expected); 127 | return *this; 128 | } 129 | 130 | inline pattern& count_hint(uint32_t expected) & 131 | { 132 | EnsureMatches(expected); 133 | return *this; 134 | } 135 | 136 | inline pattern& clear() & 137 | { 138 | m_matches.clear(); 139 | m_matched = false; 140 | return *this; 141 | } 142 | 143 | inline pattern&& count(uint32_t expected) && 144 | { 145 | EnsureMatches(expected); 146 | assert(m_matches.size() == expected); 147 | return std::move(*this); 148 | } 149 | 150 | inline pattern&& count_hint(uint32_t expected) && 151 | { 152 | EnsureMatches(expected); 153 | return std::move(*this); 154 | } 155 | 156 | inline pattern&& clear() && 157 | { 158 | m_matches.clear(); 159 | m_matched = false; 160 | return std::move(*this); 161 | } 162 | 163 | inline size_t size() 164 | { 165 | EnsureMatches(UINT32_MAX); 166 | return m_matches.size(); 167 | } 168 | 169 | inline bool empty() 170 | { 171 | return size() == 0; 172 | } 173 | 174 | inline pattern_match get(size_t index) 175 | { 176 | EnsureMatches(UINT32_MAX); 177 | return _get_internal(index); 178 | } 179 | 180 | inline pattern_match get_one() 181 | { 182 | return std::forward(*this).count(1)._get_internal(0); 183 | } 184 | 185 | template 186 | inline auto get_first(ptrdiff_t offset = 0) 187 | { 188 | return get_one().get(offset); 189 | } 190 | 191 | public: 192 | #if PATTERNS_USE_HINTS 193 | // define a hint 194 | static void hint(uint64_t hash, uintptr_t address); 195 | #endif 196 | }; 197 | 198 | class module_pattern 199 | : public pattern 200 | { 201 | public: 202 | template 203 | module_pattern(void* module, const char(&pattern)[Len]) 204 | : pattern(module) 205 | { 206 | Initialize(pattern, Len-1); 207 | } 208 | }; 209 | 210 | class range_pattern 211 | : public pattern 212 | { 213 | public: 214 | template 215 | range_pattern(uintptr_t begin, uintptr_t end, const char(&pattern)[Len]) 216 | : pattern(begin, end) 217 | { 218 | Initialize(pattern, Len-1); 219 | } 220 | }; 221 | 222 | 223 | template 224 | auto get_pattern(const char(&pattern_string)[Len], ptrdiff_t offset = 0) 225 | { 226 | return pattern(pattern_string).get_first(offset); 227 | } 228 | } 229 | 230 | #pragma warning(pop) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Audio Samples 2 | A plugin for setting arbitrary audio stream names in GTA III and GTA Vice City. 3 | -------------------------------------------------------------------------------- /VC/audio-samples.ini: -------------------------------------------------------------------------------- 1 | [Samples] 2 | AUDIO\WILD.ADF 3 | AUDIO\FLASH.ADF 4 | AUDIO\KCHAT.ADF 5 | AUDIO\FEVER.ADF 6 | AUDIO\VROCK.ADF 7 | AUDIO\VCPR.ADF 8 | AUDIO\ESPANT.ADF 9 | AUDIO\EMOTION.ADF 10 | AUDIO\WAVE.ADF 11 | AUDIO\MISCOM.MP3 12 | AUDIO\CITY.MP3 13 | AUDIO\WATER.MP3 14 | AUDIO\BEACHAMB.MP3 15 | AUDIO\HCITY.MP3 16 | AUDIO\HWATER.MP3 17 | AUDIO\HBEACH.MP3 18 | AUDIO\MALLAMB.MP3 19 | AUDIO\STRIP.MP3 20 | AUDIO\MALIBU.MP3 21 | AUDIO\HOTEL.MP3 22 | AUDIO\DIRTRING.MP3 23 | AUDIO\LAW4RIOT.MP3 24 | AUDIO\AMBSIL.MP3 25 | AUDIO\POLICE.MP3 26 | AUDIO\TAXI.MP3 27 | AUDIO\BCLOSED.MP3 28 | AUDIO\BOPEN.MP3 29 | AUDIO\ASS_1.MP3 30 | AUDIO\ASS_2.MP3 31 | AUDIO\BANK_1.MP3 32 | AUDIO\BANK_2A.MP3 33 | AUDIO\BANK_2B.MP3 34 | AUDIO\BANK_3A.MP3 35 | AUDIO\BANK_3B.MP3 36 | AUDIO\BANK_4.MP3 37 | AUDIO\BIKE_1.MP3 38 | AUDIO\BIKE_2.MP3 39 | AUDIO\BIKE_3.MP3 40 | AUDIO\BUD_1.MP3 41 | AUDIO\BUD_2.MP3 42 | AUDIO\BUD_3.MP3 43 | AUDIO\CAP_1.MP3 44 | AUDIO\CAR_1.MP3 45 | AUDIO\CNT_1A.MP3 46 | AUDIO\CNT_1B.MP3 47 | AUDIO\CNT_2.MP3 48 | AUDIO\COK_1.MP3 49 | AUDIO\COK_2A.MP3 50 | AUDIO\COK_2B.MP3 51 | AUDIO\COK_3.MP3 52 | AUDIO\COK_4A.MP3 53 | AUDIO\COK_4A2.MP3 54 | AUDIO\COK_4B.MP3 55 | AUDIO\COL_1.MP3 56 | AUDIO\COL_2.MP3 57 | AUDIO\COL_3A.MP3 58 | AUDIO\COL_4A.MP3 59 | AUDIO\COL_5A.MP3 60 | AUDIO\COL_5B.MP3 61 | AUDIO\CUB_1.MP3 62 | AUDIO\CUB_2.MP3 63 | AUDIO\CUB_3.MP3 64 | AUDIO\CUB_4.MP3 65 | AUDIO\DRUG_1.MP3 66 | AUDIO\FIN.MP3 67 | AUDIO\FIN2.MP3 68 | AUDIO\FINALE.MP3 69 | AUDIO\HAT_1.MP3 70 | AUDIO\HAT_2.MP3 71 | AUDIO\HAT_3.MP3 72 | AUDIO\ICE_1.MP3 73 | AUDIO\INT_A.MP3 74 | AUDIO\INT_B.MP3 75 | AUDIO\INT_D.MP3 76 | AUDIO\INT_M.MP3 77 | AUDIO\LAW_1A.MP3 78 | AUDIO\LAW_1B.MP3 79 | AUDIO\LAW_2A.MP3 80 | AUDIO\LAW_2B.MP3 81 | AUDIO\LAW_2C.MP3 82 | AUDIO\LAW_3.MP3 83 | AUDIO\LAW_4.MP3 84 | AUDIO\PHIL_1.MP3 85 | AUDIO\PHIL_2.MP3 86 | AUDIO\PORN_1.MP3 87 | AUDIO\PORN_2.MP3 88 | AUDIO\PORN_3.MP3 89 | AUDIO\PORN_4.MP3 90 | AUDIO\RESC_1A.MP3 91 | AUDIO\ROK_1.MP3 92 | AUDIO\ROK_2.MP3 93 | AUDIO\ROK_3A.MP3 94 | AUDIO\STRIPA.MP3 95 | AUDIO\TAX_1.MP3 96 | AUDIO\TEX_1.MP3 97 | AUDIO\TEX_2.MP3 98 | AUDIO\TEX_3.MP3 99 | AUDIO\GLIGHT.MP3 100 | AUDIO\FIST.MP3 101 | AUDIO\MISCOM.MP3 102 | AUDIO\MISCOM.MP3 103 | AUDIO\MISCOM.MP3 104 | AUDIO\MISCOM.MP3 105 | AUDIO\MOBR1.WAV 106 | AUDIO\PAGER.WAV 107 | AUDIO\CARREV.WAV 108 | AUDIO\BIKEREV.WAV 109 | AUDIO\LIFTOP.WAV 110 | AUDIO\LIFTCL.WAV 111 | AUDIO\LIFTRUN.WAV 112 | AUDIO\LIFTBEL.WAV 113 | AUDIO\INLIFT.WAV 114 | AUDIO\SFX_01.WAV 115 | AUDIO\SFX_02.WAV 116 | AUDIO\CAMERAL.WAV 117 | AUDIO\CAMERAR.WAV 118 | AUDIO\CHEER1.WAV 119 | AUDIO\CHEER2.WAV 120 | AUDIO\CHEER3.WAV 121 | AUDIO\CHEER4.WAV 122 | AUDIO\OOH1.WAV 123 | AUDIO\OOH2.WAV 124 | AUDIO\RACE1.WAV 125 | AUDIO\RACE2.WAV 126 | AUDIO\RACE3.WAV 127 | AUDIO\RACE4.WAV 128 | AUDIO\RACE5.WAV 129 | AUDIO\RACE6.WAV 130 | AUDIO\RACE7.WAV 131 | AUDIO\RACE8.WAV 132 | AUDIO\RACE9.WAV 133 | AUDIO\RACE10.WAV 134 | AUDIO\RACE11.WAV 135 | AUDIO\RACE12.WAV 136 | AUDIO\RACE13.WAV 137 | AUDIO\RACE14.WAV 138 | AUDIO\RACE15.WAV 139 | AUDIO\HOT1.WAV 140 | AUDIO\HOT2.WAV 141 | AUDIO\HOT3.WAV 142 | AUDIO\HOT4.WAV 143 | AUDIO\HOT5.WAV 144 | AUDIO\HOT6.WAV 145 | AUDIO\HOT7.WAV 146 | AUDIO\HOT8.WAV 147 | AUDIO\HOT9.WAV 148 | AUDIO\HOT10.WAV 149 | AUDIO\HOT11.WAV 150 | AUDIO\HOT12.WAV 151 | AUDIO\HOT13.WAV 152 | AUDIO\HOT14.WAV 153 | AUDIO\HOT15.WAV 154 | AUDIO\LANSTP1.WAV 155 | AUDIO\LANSTP2.WAV 156 | AUDIO\LANAMU1.WAV 157 | AUDIO\LANAMU2.WAV 158 | AUDIO\AIRHORNL.WAV 159 | AUDIO\AIRHORNR.WAV 160 | AUDIO\SNIPSCRL.WAV 161 | AUDIO\SNIPSHORT.WAV 162 | AUDIO\BLOWROOF.WAV 163 | AUDIO\ASS_1.WAV 164 | AUDIO\ASS_2.WAV 165 | AUDIO\ASS_3.WAV 166 | AUDIO\ASS_4.WAV 167 | AUDIO\ASS_5.WAV 168 | AUDIO\ASS_6.WAV 169 | AUDIO\ASS_7.WAV 170 | AUDIO\ASS_8.WAV 171 | AUDIO\ASS_9.WAV 172 | AUDIO\ASS_10.WAV 173 | AUDIO\ASS_11.WAV 174 | AUDIO\ASS_12.WAV 175 | AUDIO\ASS_13.WAV 176 | AUDIO\ASS_14.WAV 177 | AUDIO\BIKE1_1.WAV 178 | AUDIO\BIKE1_2.WAV 179 | AUDIO\BIKE1_3.WAV 180 | AUDIO\BNK1_1.WAV 181 | AUDIO\BNK1_2.WAV 182 | AUDIO\BNK1_3.WAV 183 | AUDIO\BNK1_4.WAV 184 | AUDIO\BNK1_5.WAV 185 | AUDIO\BNK1_6.WAV 186 | AUDIO\BNK1_7.WAV 187 | AUDIO\BNK1_8.WAV 188 | AUDIO\BNK1_10.WAV 189 | AUDIO\BNK1_11.WAV 190 | AUDIO\BNK1_12.WAV 191 | AUDIO\BNK1_13.WAV 192 | AUDIO\BNK1_14.WAV 193 | AUDIO\BNK2_1.WAV 194 | AUDIO\BNK2_2.WAV 195 | AUDIO\BNK2_3.WAV 196 | AUDIO\BNK2_4.WAV 197 | AUDIO\BNK2_5.WAV 198 | AUDIO\BNK2_6.WAV 199 | AUDIO\BNK2_7.WAV 200 | AUDIO\BNK2_8.WAV 201 | AUDIO\BNK2_9.WAV 202 | AUDIO\BNK3_1.WAV 203 | AUDIO\BNK3_2.WAV 204 | AUDIO\BNK3_3A.WAV 205 | AUDIO\BNK3_3B.WAV 206 | AUDIO\BNK3_3C.WAV 207 | AUDIO\BNK3_4A.WAV 208 | AUDIO\BNK3_4B.WAV 209 | AUDIO\BNK3_4C.WAV 210 | AUDIO\BNK4_1.WAV 211 | AUDIO\BNK4_2.WAV 212 | AUDIO\BNK4_3A.WAV 213 | AUDIO\BNK4_3B.WAV 214 | AUDIO\BNK4_3C.WAV 215 | AUDIO\BNK4_3D.WAV 216 | AUDIO\BNK4_3E.WAV 217 | AUDIO\BNK4_3F.WAV 218 | AUDIO\BNK4_3G.WAV 219 | AUDIO\BNK4_3H.WAV 220 | AUDIO\BNK4_3I.WAV 221 | AUDIO\BNK4_3J.WAV 222 | AUDIO\BNK4_3K.WAV 223 | AUDIO\BNK4_3M.WAV 224 | AUDIO\BNK4_3O.WAV 225 | AUDIO\BNK4_3P.WAV 226 | AUDIO\BNK4_3Q.WAV 227 | AUDIO\BNK4_3R.WAV 228 | AUDIO\BNK4_3S.WAV 229 | AUDIO\BNK4_3T.WAV 230 | AUDIO\BNK4_3U.WAV 231 | AUDIO\BNK4_3V.WAV 232 | AUDIO\BNK4_4A.WAV 233 | AUDIO\BNK4_4B.WAV 234 | AUDIO\BNK4_5.WAV 235 | AUDIO\BNK4_6.WAV 236 | AUDIO\BNK4_7.WAV 237 | AUDIO\BNK4_8.WAV 238 | AUDIO\BNK4_9.WAV 239 | AUDIO\BNK4_10.WAV 240 | AUDIO\BNK4_11.WAV 241 | AUDIO\BK4_12A.WAV 242 | AUDIO\BK4_12B.WAV 243 | AUDIO\BK4_12C.WAV 244 | AUDIO\BNK4_13.WAV 245 | AUDIO\BK4_14A.WAV 246 | AUDIO\BK4_14B.WAV 247 | AUDIO\BNK4_15.WAV 248 | AUDIO\BNK4_16.WAV 249 | AUDIO\BNK4_17.WAV 250 | AUDIO\BNK4_18.WAV 251 | AUDIO\BK4_19A.WAV 252 | AUDIO\BK4_19B.WAV 253 | AUDIO\BK4_20A.WAV 254 | AUDIO\BK4_20B.WAV 255 | AUDIO\BNK4_21.WAV 256 | AUDIO\BNK422A.WAV 257 | AUDIO\BNK422B.WAV 258 | AUDIO\BK4_23A.WAV 259 | AUDIO\BK4_23B.WAV 260 | AUDIO\BK4_23C.WAV 261 | AUDIO\BK4_23D.WAV 262 | AUDIO\BK4_24A.WAV 263 | AUDIO\BK4_24B.WAV 264 | AUDIO\BNK4_25.WAV 265 | AUDIO\BNK4_26.WAV 266 | AUDIO\BNK4_27.WAV 267 | AUDIO\BNK4_28.WAV 268 | AUDIO\BNK4_29.WAV 269 | AUDIO\BNK4_30.WAV 270 | AUDIO\BK4_31A.WAV 271 | AUDIO\BK4_31B.WAV 272 | AUDIO\BNK4_32.WAV 273 | AUDIO\BK4_34A.WAV 274 | AUDIO\BK4_34B.WAV 275 | AUDIO\BK4_35A.WAV 276 | AUDIO\BK4_35B.WAV 277 | AUDIO\BNK4_36.WAV 278 | AUDIO\BNK4_37.WAV 279 | AUDIO\BNK4_38.WAV 280 | AUDIO\BNK4_39.WAV 281 | AUDIO\BK4_40A.WAV 282 | AUDIO\BK4_40B.WAV 283 | AUDIO\BNK4_41.WAV 284 | AUDIO\BNK4_42.WAV 285 | AUDIO\BNK4_43.WAV 286 | AUDIO\BNK4_44.WAV 287 | AUDIO\BNK4_45.WAV 288 | AUDIO\BNK4_46.WAV 289 | AUDIO\BNK4_47.WAV 290 | AUDIO\BNK4_48.WAV 291 | AUDIO\BNK4_49.WAV 292 | AUDIO\BNK450A.WAV 293 | AUDIO\BNK450B.WAV 294 | AUDIO\BNK4_51.WAV 295 | AUDIO\BNK4_94.WAV 296 | AUDIO\BNK4_95.WAV 297 | AUDIO\BNK4_96.WAV 298 | AUDIO\BNK4_97.WAV 299 | AUDIO\BNK4_98.WAV 300 | AUDIO\BNK4_99.WAV 301 | AUDIO\BUD1_1.WAV 302 | AUDIO\BUD1_2.WAV 303 | AUDIO\BUD1_3.WAV 304 | AUDIO\BUD1_4.WAV 305 | AUDIO\BUD1_5.WAV 306 | AUDIO\BUD1_9.WAV 307 | AUDIO\BUD1_10.WAV 308 | AUDIO\BUD2_1.WAV 309 | AUDIO\BUD2_2.WAV 310 | AUDIO\BUD2_3.WAV 311 | AUDIO\BUD2_4.WAV 312 | AUDIO\BUD2_5.WAV 313 | AUDIO\BUD2_6.WAV 314 | AUDIO\BUD2_7.WAV 315 | AUDIO\BUD3_1.WAV 316 | AUDIO\BUD3_1A.WAV 317 | AUDIO\BUD3_1B.WAV 318 | AUDIO\BUD3_1C.WAV 319 | AUDIO\BUD3_2.WAV 320 | AUDIO\BUD3_3.WAV 321 | AUDIO\BUD3_4.WAV 322 | AUDIO\BUD3_5.WAV 323 | AUDIO\BUD3_6.WAV 324 | AUDIO\BUD3_7.WAV 325 | AUDIO\BUD3_8A.WAV 326 | AUDIO\BUD3_8B.WAV 327 | AUDIO\BUD3_8C.WAV 328 | AUDIO\BUD3_9A.WAV 329 | AUDIO\BUD3_9B.WAV 330 | AUDIO\BUD3_9C.WAV 331 | AUDIO\CAP1_2.WAV 332 | AUDIO\CAP1_3.WAV 333 | AUDIO\CAP1_4.WAV 334 | AUDIO\CAP1_5.WAV 335 | AUDIO\CAP1_6.WAV 336 | AUDIO\CAP1_7.WAV 337 | AUDIO\CAP1_8.WAV 338 | AUDIO\CAP1_9.WAV 339 | AUDIO\CAP1_10.WAV 340 | AUDIO\CAP1_11.WAV 341 | AUDIO\CAP1_12.WAV 342 | AUDIO\CNT1_1.WAV 343 | AUDIO\CNT1_2.WAV 344 | AUDIO\CNT1_3.WAV 345 | AUDIO\CNT1_4.WAV 346 | AUDIO\CNT1_5.WAV 347 | AUDIO\CNT2_1.WAV 348 | AUDIO\CNT2_2.WAV 349 | AUDIO\CNT2_3.WAV 350 | AUDIO\CNT2_4.WAV 351 | AUDIO\COK1_1.WAV 352 | AUDIO\COK1_2.WAV 353 | AUDIO\COK1_3.WAV 354 | AUDIO\COK1_4.WAV 355 | AUDIO\COK1_5.WAV 356 | AUDIO\COK1_6.WAV 357 | AUDIO\COK2_1.WAV 358 | AUDIO\COK2_2.WAV 359 | AUDIO\COK2_3.WAV 360 | AUDIO\COK2_4.WAV 361 | AUDIO\COK2_5.WAV 362 | AUDIO\COK2_6.WAV 363 | AUDIO\COK2_7A.WAV 364 | AUDIO\COK2_7B.WAV 365 | AUDIO\COK2_7C.WAV 366 | AUDIO\COK2_8A.WAV 367 | AUDIO\COK2_8B.WAV 368 | AUDIO\COK2_8C.WAV 369 | AUDIO\COK2_8D.WAV 370 | AUDIO\COK2_9.WAV 371 | AUDIO\COK210A.WAV 372 | AUDIO\COK210B.WAV 373 | AUDIO\COK210C.WAV 374 | AUDIO\COK212A.WAV 375 | AUDIO\COK212B.WAV 376 | AUDIO\COK2_13.WAV 377 | AUDIO\COK2_14.WAV 378 | AUDIO\COK2_15.WAV 379 | AUDIO\COK2_16.WAV 380 | AUDIO\COK2_20.WAV 381 | AUDIO\COK2_21.WAV 382 | AUDIO\COK2_2.WAV 383 | AUDIO\COK3_1.WAV 384 | AUDIO\COK3_2.WAV 385 | AUDIO\COK3_3.WAV 386 | AUDIO\COK3_4.WAV 387 | AUDIO\COK4_1.WAV 388 | AUDIO\COK4_2.WAV 389 | AUDIO\COK4_3.WAV 390 | AUDIO\COK4_4.WAV 391 | AUDIO\COK4_5.WAV 392 | AUDIO\COK4_6.WAV 393 | AUDIO\COK4_7.WAV 394 | AUDIO\COK4_8.WAV 395 | AUDIO\COK4_9.WAV 396 | AUDIO\COK4_9A.WAV 397 | AUDIO\COK4_10.WAV 398 | AUDIO\COK4_11.WAV 399 | AUDIO\COK4_12.WAV 400 | AUDIO\COK4_13.WAV 401 | AUDIO\COK4_14.WAV 402 | AUDIO\COK4_15.WAV 403 | AUDIO\COK4_16.WAV 404 | AUDIO\COK4_17.WAV 405 | AUDIO\COK4_18.WAV 406 | AUDIO\COK4_19.WAV 407 | AUDIO\COK4_20.WAV 408 | AUDIO\COK4_21.WAV 409 | AUDIO\COK4_22.WAV 410 | AUDIO\COK4_23.WAV 411 | AUDIO\COK4_24.WAV 412 | AUDIO\COK4_25.WAV 413 | AUDIO\COK4_26.WAV 414 | AUDIO\COK4_27.WAV 415 | AUDIO\COL1_1.WAV 416 | AUDIO\COL1_2.WAV 417 | AUDIO\COL1_3.WAV 418 | AUDIO\COL1_4.WAV 419 | AUDIO\COL1_5.WAV 420 | AUDIO\COL1_6.WAV 421 | AUDIO\COL1_7.WAV 422 | AUDIO\COL1_8.WAV 423 | AUDIO\COL2_1.WAV 424 | AUDIO\COL2_2.WAV 425 | AUDIO\COL2_3.WAV 426 | AUDIO\COL2_4.WAV 427 | AUDIO\COL2_5.WAV 428 | AUDIO\COL2_6A.WAV 429 | AUDIO\COL2_7.WAV 430 | AUDIO\COL2_8.WAV 431 | AUDIO\COL2_9.WAV 432 | AUDIO\COL2_10.WAV 433 | AUDIO\COL2_11.WAV 434 | AUDIO\COL2_12.WAV 435 | AUDIO\COL2_13.WAV 436 | AUDIO\COL2_14.WAV 437 | AUDIO\COL2_15.WAV 438 | AUDIO\COL2_16.WAV 439 | AUDIO\COL3_1.WAV 440 | AUDIO\COL3_2.WAV 441 | AUDIO\COL3_2A.WAV 442 | AUDIO\COL3_2B.WAV 443 | AUDIO\COL3_3.WAV 444 | AUDIO\COL3_4.WAV 445 | AUDIO\COL3_5.WAV 446 | AUDIO\COL3_6.WAV 447 | AUDIO\COL3_7.WAV 448 | AUDIO\COL3_8.WAV 449 | AUDIO\COL3_9.WAV 450 | AUDIO\COL3_10.WAV 451 | AUDIO\COL3_11.WAV 452 | AUDIO\COL3_12.WAV 453 | AUDIO\COL3_13.WAV 454 | AUDIO\COL3_14.WAV 455 | AUDIO\COL3_15.WAV 456 | AUDIO\COL3_16.WAV 457 | AUDIO\COL3_17.WAV 458 | AUDIO\COL3_18.WAV 459 | AUDIO\COL3_19.WAV 460 | AUDIO\COL3_20.WAV 461 | AUDIO\COL3_21.WAV 462 | AUDIO\COL3_23.WAV 463 | AUDIO\COL3_24.WAV 464 | AUDIO\COL3_25.WAV 465 | AUDIO\COL4_1.WAV 466 | AUDIO\COL4_2.WAV 467 | AUDIO\COL4_3.WAV 468 | AUDIO\COL4_4.WAV 469 | AUDIO\COL4_5.WAV 470 | AUDIO\COL4_6.WAV 471 | AUDIO\COL4_7.WAV 472 | AUDIO\COL4_8.WAV 473 | AUDIO\COL4_9.WAV 474 | AUDIO\COL4_10.WAV 475 | AUDIO\COL4_11.WAV 476 | AUDIO\COL4_12.WAV 477 | AUDIO\COL4_13.WAV 478 | AUDIO\COL4_14.WAV 479 | AUDIO\COL4_15.WAV 480 | AUDIO\COL4_16.WAV 481 | AUDIO\COL4_17.WAV 482 | AUDIO\COL4_18.WAV 483 | AUDIO\COL4_19.WAV 484 | AUDIO\COL4_20.WAV 485 | AUDIO\COL4_21.WAV 486 | AUDIO\COL4_22.WAV 487 | AUDIO\COL4_23.WAV 488 | AUDIO\COL4_24.WAV 489 | AUDIO\COL4_25.WAV 490 | AUDIO\COL4_26.WAV 491 | AUDIO\COL5_1.WAV 492 | AUDIO\COL5_2.WAV 493 | AUDIO\COL5_3.WAV 494 | AUDIO\COL5_4.WAV 495 | AUDIO\COL5_5.WAV 496 | AUDIO\COL5_6.WAV 497 | AUDIO\COL5_7.WAV 498 | AUDIO\COL5_8.WAV 499 | AUDIO\COL5_9.WAV 500 | AUDIO\COL5_10.WAV 501 | AUDIO\COL5_11.WAV 502 | AUDIO\COL5_12.WAV 503 | AUDIO\COL5_13.WAV 504 | AUDIO\COL5_14.WAV 505 | AUDIO\COL5_15.WAV 506 | AUDIO\COL5_16.WAV 507 | AUDIO\COL5_17.WAV 508 | AUDIO\COL5_18.WAV 509 | AUDIO\COL5_19.WAV 510 | AUDIO\COL5_20.WAV 511 | AUDIO\COL5_21.WAV 512 | AUDIO\COL5_22.WAV 513 | AUDIO\CUB1_1.WAV 514 | AUDIO\CUB1_2.WAV 515 | AUDIO\CUB1_3.WAV 516 | AUDIO\CUB1_4.WAV 517 | AUDIO\CUB1_5.WAV 518 | AUDIO\CUB1_6.WAV 519 | AUDIO\CUB1_7.WAV 520 | AUDIO\CUB1_8.WAV 521 | AUDIO\CUB1_9.WAV 522 | AUDIO\CUB1_10.WAV 523 | AUDIO\CUB2_1.WAV 524 | AUDIO\CUB2_2.WAV 525 | AUDIO\CUB2_3A.WAV 526 | AUDIO\CUB2_3B.WAV 527 | AUDIO\CUB2_3C.WAV 528 | AUDIO\CUB2_4A.WAV 529 | AUDIO\CUB2_5.WAV 530 | AUDIO\CUB2_6.WAV 531 | AUDIO\CUB2_7.WAV 532 | AUDIO\CUB2_8.WAV 533 | AUDIO\CUB2_9.WAV 534 | AUDIO\CUB2_10.WAV 535 | AUDIO\CUB2_11.WAV 536 | AUDIO\CUB3_1.WAV 537 | AUDIO\CUB3_2.WAV 538 | AUDIO\CUB3_3.WAV 539 | AUDIO\CUB3_4.WAV 540 | AUDIO\CUB4_1.WAV 541 | AUDIO\CUB4_2.WAV 542 | AUDIO\CUB4_3.WAV 543 | AUDIO\CUB4_4.WAV 544 | AUDIO\CUB4_5.WAV 545 | AUDIO\CUB4_5A.WAV 546 | AUDIO\CUB4_6.WAV 547 | AUDIO\CUB4_7.WAV 548 | AUDIO\CUB4_8.WAV 549 | AUDIO\CUB4_9.WAV 550 | AUDIO\CUB4_10.WAV 551 | AUDIO\CUB4_11.WAV 552 | AUDIO\CUB4_12.WAV 553 | AUDIO\CUB4_13.WAV 554 | AUDIO\CUB4_14.WAV 555 | AUDIO\CUB4_15.WAV 556 | AUDIO\CUB4_16.WAV 557 | AUDIO\GOLF_1.WAV 558 | AUDIO\GOLF_2.WAV 559 | AUDIO\GOLF_3.WAV 560 | AUDIO\BAR_1.WAV 561 | AUDIO\BAR_2.WAV 562 | AUDIO\BAR_3.WAV 563 | AUDIO\BAR_4.WAV 564 | AUDIO\BAR_5.WAV 565 | AUDIO\BAR_6.WAV 566 | AUDIO\BAR_7.WAV 567 | AUDIO\BAR_8.WAV 568 | AUDIO\STRIP_1.WAV 569 | AUDIO\STRIP_2.WAV 570 | AUDIO\STRIP_3.WAV 571 | AUDIO\STRIP_4.WAV 572 | AUDIO\STRIP_5.WAV 573 | AUDIO\STRIP_6.WAV 574 | AUDIO\STRIP_7.WAV 575 | AUDIO\STRIP_8.WAV 576 | AUDIO\STRIP_9.WAV 577 | AUDIO\STAR_1.WAV 578 | AUDIO\STAR_2.WAV 579 | AUDIO\STAR_3.WAV 580 | AUDIO\STAR_4.WAV 581 | AUDIO\FIN_1A.WAV 582 | AUDIO\FIN_1B.WAV 583 | AUDIO\FIN_1C.WAV 584 | AUDIO\FIN_2B.WAV 585 | AUDIO\FIN_2C.WAV 586 | AUDIO\FIN_3.WAV 587 | AUDIO\FIN_4.WAV 588 | AUDIO\FIN_5.WAV 589 | AUDIO\FIN_6.WAV 590 | AUDIO\FIN_10.WAV 591 | AUDIO\FIN_11A.WAV 592 | AUDIO\FIN_11B.WAV 593 | AUDIO\FIN_12A.WAV 594 | AUDIO\FIN_12B.WAV 595 | AUDIO\FIN_12C.WAV 596 | AUDIO\FIN_13.WAV 597 | AUDIO\FINKILL.WAV 598 | AUDIO\LAW1_1.WAV 599 | AUDIO\LAW1_2.WAV 600 | AUDIO\LAW1_3.WAV 601 | AUDIO\LAW1_4.WAV 602 | AUDIO\LAW1_5.WAV 603 | AUDIO\LAW1_6.WAV 604 | AUDIO\LAW1_7.WAV 605 | AUDIO\LAW1_8.WAV 606 | AUDIO\LAW1_9.WAV 607 | AUDIO\LAW1_10.WAV 608 | AUDIO\LAW2_1.WAV 609 | AUDIO\LAW2_2.WAV 610 | AUDIO\LAW2_3.WAV 611 | AUDIO\LAW2_4.WAV 612 | AUDIO\LAW2_5.WAV 613 | AUDIO\LAW2_6.WAV 614 | AUDIO\LAW2_7.WAV 615 | AUDIO\LAW2_8.WAV 616 | AUDIO\LAW2_9.WAV 617 | AUDIO\LAW2_10.WAV 618 | AUDIO\LAW3_1.WAV 619 | AUDIO\LAW3_2.WAV 620 | AUDIO\LAW3_3.WAV 621 | AUDIO\LAW3_4.WAV 622 | AUDIO\LAW3_5.WAV 623 | AUDIO\LAW3_6.WAV 624 | AUDIO\LAW3_10.WAV 625 | AUDIO\LAW3_11.WAV 626 | AUDIO\LAW3_12.WAV 627 | AUDIO\LAW3_13.WAV 628 | AUDIO\LAW3_14.WAV 629 | AUDIO\LAW3_16.WAV 630 | AUDIO\LAW3_17.WAV 631 | AUDIO\LAW3_18.WAV 632 | AUDIO\LAW3_19.WAV 633 | AUDIO\LAW3_20.WAV 634 | AUDIO\LAW3_21.WAV 635 | AUDIO\LAW3_22.WAV 636 | AUDIO\LAW3_23.WAV 637 | AUDIO\LAW3_24.WAV 638 | AUDIO\LAW3_25.WAV 639 | AUDIO\LAW4_1A.WAV 640 | AUDIO\LAW4_1B.WAV 641 | AUDIO\LAW4_1C.WAV 642 | AUDIO\LAW4_1D.WAV 643 | AUDIO\LAW4_10.WAV 644 | AUDIO\LAW4_3.WAV 645 | AUDIO\LAW4_4.WAV 646 | AUDIO\LAW4_5.WAV 647 | AUDIO\LAW4_6.WAV 648 | AUDIO\LAW4_7.WAV 649 | AUDIO\LAW4_8.WAV 650 | AUDIO\LAW4_9.WAV 651 | AUDIO\PHIL1_2.WAV 652 | AUDIO\PHIL1_3.WAV 653 | AUDIO\PHIL2_1.WAV 654 | AUDIO\PHIL2_2.WAV 655 | AUDIO\PHIL2_3.WAV 656 | AUDIO\PHIL2_4.WAV 657 | AUDIO\PHIL2_5.WAV 658 | AUDIO\PHIL2_6.WAV 659 | AUDIO\PHIL2_7.WAV 660 | AUDIO\PHIL2_8.WAV 661 | AUDIO\PHIL2_9.WAV 662 | AUDIO\PHIL210.WAV 663 | AUDIO\PHIL211.WAV 664 | AUDIO\PORN1_1.WAV 665 | AUDIO\PORN1_2.WAV 666 | AUDIO\PORN1_3.WAV 667 | AUDIO\PRN1_3A.WAV 668 | AUDIO\PORN1_4.WAV 669 | AUDIO\PORN1_5.WAV 670 | AUDIO\PORN1_6.WAV 671 | AUDIO\PORN1_7.WAV 672 | AUDIO\PORN1_8.WAV 673 | AUDIO\PORN1_9.WAV 674 | AUDIO\PRN1_10.WAV 675 | AUDIO\PRN1_11.WAV 676 | AUDIO\PRN1_12.WAV 677 | AUDIO\PRN1_13.WAV 678 | AUDIO\PRN1_14.WAV 679 | AUDIO\PRN1_15.WAV 680 | AUDIO\PRN1_16.WAV 681 | AUDIO\PRN1_17.WAV 682 | AUDIO\PRN1_18.WAV 683 | AUDIO\PRN1_19.WAV 684 | AUDIO\PRN1_20.WAV 685 | AUDIO\PRN1_21.WAV 686 | AUDIO\PORN3_1.WAV 687 | AUDIO\PORN3_2.WAV 688 | AUDIO\PORN3_3.WAV 689 | AUDIO\PORN3_4.WAV 690 | AUDIO\PSYCH_1.WAV 691 | AUDIO\PSYCH_2.WAV 692 | AUDIO\ROK2_01.WAV 693 | AUDIO\ROK3_1.WAV 694 | AUDIO\ROK3_2.WAV 695 | AUDIO\ROK3_3.WAV 696 | AUDIO\ROK3_4.WAV 697 | AUDIO\ROK3_5.WAV 698 | AUDIO\ROK3_6.WAV 699 | AUDIO\ROK3_7.WAV 700 | AUDIO\ROK3_8.WAV 701 | AUDIO\ROK3_9.WAV 702 | AUDIO\ROK3_10.WAV 703 | AUDIO\ROK3_11.WAV 704 | AUDIO\ROK3_12.WAV 705 | AUDIO\ROK3_13.WAV 706 | AUDIO\ROK3_14.WAV 707 | AUDIO\ROK3_15.WAV 708 | AUDIO\ROK3_16.WAV 709 | AUDIO\ROK3_17.WAV 710 | AUDIO\ROK3_18.WAV 711 | AUDIO\ROK3_19.WAV 712 | AUDIO\ROK3_20.WAV 713 | AUDIO\ROK3_21.WAV 714 | AUDIO\ROK3_22.WAV 715 | AUDIO\ROK3_23.WAV 716 | AUDIO\ROK3_24.WAV 717 | AUDIO\ROK3_25.WAV 718 | AUDIO\ROK3_26.WAV 719 | AUDIO\ROK3_27.WAV 720 | AUDIO\ROK3_62.WAV 721 | AUDIO\ROK3_63.WAV 722 | AUDIO\ROK3_64.WAV 723 | AUDIO\ROK3_65.WAV 724 | AUDIO\ROK3_66.WAV 725 | AUDIO\ROK3_67.WAV 726 | AUDIO\ROK3_68.WAV 727 | AUDIO\ROK3_69.WAV 728 | AUDIO\ROK3_70.WAV 729 | AUDIO\ROK3_71.WAV 730 | AUDIO\ROK3_73.WAV 731 | AUDIO\RESC_1.WAV 732 | AUDIO\RESC_2.WAV 733 | AUDIO\RESC_3.WAV 734 | AUDIO\RESC_4.WAV 735 | AUDIO\RESC_5.WAV 736 | AUDIO\RESC_6.WAV 737 | AUDIO\RESC_7.WAV 738 | AUDIO\RESC_8.WAV 739 | AUDIO\RESC_9.WAV 740 | AUDIO\RESC_10.WAV 741 | AUDIO\ROK1_1A.WAV 742 | AUDIO\ROK1_1B.WAV 743 | AUDIO\ROK1_5.WAV 744 | AUDIO\ROK1_6.WAV 745 | AUDIO\ROK1_7.WAV 746 | AUDIO\ROK1_8.WAV 747 | AUDIO\ROK1_9.WAV 748 | AUDIO\TAX1_1.WAV 749 | AUDIO\TAX1_2.WAV 750 | AUDIO\TAX1_3.WAV 751 | AUDIO\TAX1_4.WAV 752 | AUDIO\TAX1_5.WAV 753 | AUDIO\TAX2_1.WAV 754 | AUDIO\TAX2_2.WAV 755 | AUDIO\TAX2_3.WAV 756 | AUDIO\TAX2_4.WAV 757 | AUDIO\TAX2_5.WAV 758 | AUDIO\TAX2_6.WAV 759 | AUDIO\TAX2_7.WAV 760 | AUDIO\TAX3_1.WAV 761 | AUDIO\TAX3_2.WAV 762 | AUDIO\TAX3_3.WAV 763 | AUDIO\TAX3_4.WAV 764 | AUDIO\TAX3_5.WAV 765 | AUDIO\TEX1_1.WAV 766 | AUDIO\TEX1_2.WAV 767 | AUDIO\TEX1_3.WAV 768 | AUDIO\TEX1_4.WAV 769 | AUDIO\TEX1_5.WAV 770 | AUDIO\TEX1_6.WAV 771 | AUDIO\TEX2_1.WAV 772 | AUDIO\TEX3_1.WAV 773 | AUDIO\TEX3_2.WAV 774 | AUDIO\TEX3_3.WAV 775 | AUDIO\TEX3_4.WAV 776 | AUDIO\TEX3_5.WAV 777 | AUDIO\TEX3_6.WAV 778 | AUDIO\TEX3_7.WAV 779 | AUDIO\TEX3_8.WAV 780 | AUDIO\HAT_1A.WAV 781 | AUDIO\INTRO1.WAV 782 | AUDIO\INTRO2.WAV 783 | AUDIO\INTRO3.WAV 784 | AUDIO\INTRO4.WAV 785 | AUDIO\MOB_01A.WAV 786 | AUDIO\MOB_01B.WAV 787 | AUDIO\MOB_01C.WAV 788 | AUDIO\MOB_02A.WAV 789 | AUDIO\MOB_02B.WAV 790 | AUDIO\MOB_02C.WAV 791 | AUDIO\MOB_03A.WAV 792 | AUDIO\MOB_03B.WAV 793 | AUDIO\MOB_03C.WAV 794 | AUDIO\MOB_03D.WAV 795 | AUDIO\MOB_03E.WAV 796 | AUDIO\SHARK_1.WAV 797 | AUDIO\SHARK_2.WAV 798 | AUDIO\SHARK_3.WAV 799 | AUDIO\SHARK_4.WAV 800 | AUDIO\SHARK_5.WAV 801 | AUDIO\MOB_04A.WAV 802 | AUDIO\MOB_04B.WAV 803 | AUDIO\MOB_04C.WAV 804 | AUDIO\MOB_04D.WAV 805 | AUDIO\MOB_05A.WAV 806 | AUDIO\MOB_05B.WAV 807 | AUDIO\MOB_05C.WAV 808 | AUDIO\MOB_05D.WAV 809 | AUDIO\MOB_06A.WAV 810 | AUDIO\MOB_06B.WAV 811 | AUDIO\MOB_06C.WAV 812 | AUDIO\MOB_07A.WAV 813 | AUDIO\MOB_07B.WAV 814 | AUDIO\MOB_08A.WAV 815 | AUDIO\MOB_08B.WAV 816 | AUDIO\MOB_08C.WAV 817 | AUDIO\MOB_08D.WAV 818 | AUDIO\MOB_08E.WAV 819 | AUDIO\MOB_08F.WAV 820 | AUDIO\MOB_08G.WAV 821 | AUDIO\MOB_09A.WAV 822 | AUDIO\MOB_09B.WAV 823 | AUDIO\MOB_09C.WAV 824 | AUDIO\MOB_09D.WAV 825 | AUDIO\MOB_09E.WAV 826 | AUDIO\MOB_09F.WAV 827 | AUDIO\MOB_10A.WAV 828 | AUDIO\MOB_10B.WAV 829 | AUDIO\MOB_10C.WAV 830 | AUDIO\MOB_10D.WAV 831 | AUDIO\MOB_10E.WAV 832 | AUDIO\MOB_11A.WAV 833 | AUDIO\MOB_11B.WAV 834 | AUDIO\MOB_11C.WAV 835 | AUDIO\MOB_11D.WAV 836 | AUDIO\MOB_11E.WAV 837 | AUDIO\MOB_11F.WAV 838 | AUDIO\MOB_14A.WAV 839 | AUDIO\MOB_14B.WAV 840 | AUDIO\MOB_14C.WAV 841 | AUDIO\MOB_14D.WAV 842 | AUDIO\MOB_14E.WAV 843 | AUDIO\MOB_14F.WAV 844 | AUDIO\MOB_14G.WAV 845 | AUDIO\MOB_14H.WAV 846 | AUDIO\MOB_16A.WAV 847 | AUDIO\MOB_16B.WAV 848 | AUDIO\MOB_16C.WAV 849 | AUDIO\MOB_16D.WAV 850 | AUDIO\MOB_16E.WAV 851 | AUDIO\MOB_16F.WAV 852 | AUDIO\MOB_16G.WAV 853 | AUDIO\MOB_17A.WAV 854 | AUDIO\MOB_17B.WAV 855 | AUDIO\MOB_17C.WAV 856 | AUDIO\MOB_17D.WAV 857 | AUDIO\MOB_17E.WAV 858 | AUDIO\MOB_17G.WAV 859 | AUDIO\MOB_17H.WAV 860 | AUDIO\MOB_17I.WAV 861 | AUDIO\MOB_17J.WAV 862 | AUDIO\MOB_17K.WAV 863 | AUDIO\MOB_17L.WAV 864 | AUDIO\MOB_18A.WAV 865 | AUDIO\MOB_18B.WAV 866 | AUDIO\MOB_18C.WAV 867 | AUDIO\MOB_18D.WAV 868 | AUDIO\MOB_18E.WAV 869 | AUDIO\MOB_18F.WAV 870 | AUDIO\MOB_18G.WAV 871 | AUDIO\MOB_20A.WAV 872 | AUDIO\MOB_20B.WAV 873 | AUDIO\MOB_20C.WAV 874 | AUDIO\MOB_20D.WAV 875 | AUDIO\MOB_20E.WAV 876 | AUDIO\MOB_24A.WAV 877 | AUDIO\MOB_24B.WAV 878 | AUDIO\MOB_24C.WAV 879 | AUDIO\MOB_24D.WAV 880 | AUDIO\MOB_24E.WAV 881 | AUDIO\MOB_24F.WAV 882 | AUDIO\MOB_24G.WAV 883 | AUDIO\MOB_24H.WAV 884 | AUDIO\MOB_25A.WAV 885 | AUDIO\MOB_25B.WAV 886 | AUDIO\MOB_25C.WAV 887 | AUDIO\MOB_25D.WAV 888 | AUDIO\MOB_26A.WAV 889 | AUDIO\MOB_26B.WAV 890 | AUDIO\MOB_26C.WAV 891 | AUDIO\MOB_26D.WAV 892 | AUDIO\MOB_26E.WAV 893 | AUDIO\MOB_29A.WAV 894 | AUDIO\MOB_29B.WAV 895 | AUDIO\MOB_29C.WAV 896 | AUDIO\MOB_29D.WAV 897 | AUDIO\MOB_29E.WAV 898 | AUDIO\MOB_29F.WAV 899 | AUDIO\MOB_29G.WAV 900 | AUDIO\MOB_30A.WAV 901 | AUDIO\MOB_30B.WAV 902 | AUDIO\MOB_30C.WAV 903 | AUDIO\MOB_30D.WAV 904 | AUDIO\MOB_30E.WAV 905 | AUDIO\MOB_30F.WAV 906 | AUDIO\MOB_33A.WAV 907 | AUDIO\MOB_33B.WAV 908 | AUDIO\MOB_33C.WAV 909 | AUDIO\MOB_33D.WAV 910 | AUDIO\MOB_34A.WAV 911 | AUDIO\MOB_34B.WAV 912 | AUDIO\MOB_34C.WAV 913 | AUDIO\MOB_34D.WAV 914 | AUDIO\MOB_35A.WAV 915 | AUDIO\MOB_35B.WAV 916 | AUDIO\MOB_35C.WAV 917 | AUDIO\MOB_35D.WAV 918 | AUDIO\MOB_36A.WAV 919 | AUDIO\MOB_36B.WAV 920 | AUDIO\MOB_36C.WAV 921 | AUDIO\MOB_40A.WAV 922 | AUDIO\MOB_40B.WAV 923 | AUDIO\MOB_40C.WAV 924 | AUDIO\MOB_40D.WAV 925 | AUDIO\MOB_40E.WAV 926 | AUDIO\MOB_40F.WAV 927 | AUDIO\MOB_40G.WAV 928 | AUDIO\MOB_40H.WAV 929 | AUDIO\MOB_40I.WAV 930 | AUDIO\MOB_41A.WAV 931 | AUDIO\MOB_41B.WAV 932 | AUDIO\MOB_41C.WAV 933 | AUDIO\MOB_41D.WAV 934 | AUDIO\MOB_41E.WAV 935 | AUDIO\MOB_41F.WAV 936 | AUDIO\MOB_41G.WAV 937 | AUDIO\MOB_41H.WAV 938 | AUDIO\MOB_42A.WAV 939 | AUDIO\MOB_42B.WAV 940 | AUDIO\MOB_42C.WAV 941 | AUDIO\MOB_42D.WAV 942 | AUDIO\MOB_42E.WAV 943 | AUDIO\MOB_43A.WAV 944 | AUDIO\MOB_43B.WAV 945 | AUDIO\MOB_43C.WAV 946 | AUDIO\MOB_43D.WAV 947 | AUDIO\MOB_43E.WAV 948 | AUDIO\MOB_43F.WAV 949 | AUDIO\MOB_43G.WAV 950 | AUDIO\MOB_43H.WAV 951 | AUDIO\MOB_45A.WAV 952 | AUDIO\MOB_45B.WAV 953 | AUDIO\MOB_45C.WAV 954 | AUDIO\MOB_45D.WAV 955 | AUDIO\MOB_45E.WAV 956 | AUDIO\MOB_45F.WAV 957 | AUDIO\MOB_45G.WAV 958 | AUDIO\MOB_45H.WAV 959 | AUDIO\MOB_45I.WAV 960 | AUDIO\MOB_45J.WAV 961 | AUDIO\MOB_45K.WAV 962 | AUDIO\MOB_45L.WAV 963 | AUDIO\MOB_45M.WAV 964 | AUDIO\MOB_45N.WAV 965 | AUDIO\MOB_46A.WAV 966 | AUDIO\MOB_46B.WAV 967 | AUDIO\MOB_46C.WAV 968 | AUDIO\MOB_46D.WAV 969 | AUDIO\MOB_46E.WAV 970 | AUDIO\MOB_46F.WAV 971 | AUDIO\MOB_46G.WAV 972 | AUDIO\MOB_46H.WAV 973 | AUDIO\MOB_47A.WAV 974 | AUDIO\MOB_52A.WAV 975 | AUDIO\MOB_52B.WAV 976 | AUDIO\MOB_52C.WAV 977 | AUDIO\MOB_52D.WAV 978 | AUDIO\MOB_52E.WAV 979 | AUDIO\MOB_52F.WAV 980 | AUDIO\MOB_52G.WAV 981 | AUDIO\MOB_52H.WAV 982 | AUDIO\MOB_54A.WAV 983 | AUDIO\MOB_54B.WAV 984 | AUDIO\MOB_54C.WAV 985 | AUDIO\MOB_54D.WAV 986 | AUDIO\MOB_54E.WAV 987 | AUDIO\MOB_55A.WAV 988 | AUDIO\MOB_55B.WAV 989 | AUDIO\MOB_55C.WAV 990 | AUDIO\MOB_55D.WAV 991 | AUDIO\MOB_55E.WAV 992 | AUDIO\MOB_55F.WAV 993 | AUDIO\MOB_56A.WAV 994 | AUDIO\MOB_56B.WAV 995 | AUDIO\MOB_56C.WAV 996 | AUDIO\MOB_56D.WAV 997 | AUDIO\MOB_56E.WAV 998 | AUDIO\MOB_56F.WAV 999 | AUDIO\MOB_57A.WAV 1000 | AUDIO\MOB_57B.WAV 1001 | AUDIO\MOB_57C.WAV 1002 | AUDIO\MOB_57D.WAV 1003 | AUDIO\MOB_57E.WAV 1004 | AUDIO\MOB_58A.WAV 1005 | AUDIO\MOB_58B.WAV 1006 | AUDIO\MOB_58C.WAV 1007 | AUDIO\MOB_58D.WAV 1008 | AUDIO\MOB_58E.WAV 1009 | AUDIO\MOB_58F.WAV 1010 | AUDIO\MOB_58G.WAV 1011 | AUDIO\MOB_61A.WAV 1012 | AUDIO\MOB_61B.WAV 1013 | AUDIO\MOB_62A.WAV 1014 | AUDIO\MOB_62B.WAV 1015 | AUDIO\MOB_62C.WAV 1016 | AUDIO\MOB_62D.WAV 1017 | AUDIO\MOB_63A.WAV 1018 | AUDIO\MOB_63B.WAV 1019 | AUDIO\MOB_63C.WAV 1020 | AUDIO\MOB_63D.WAV 1021 | AUDIO\MOB_63E.WAV 1022 | AUDIO\MOB_63F.WAV 1023 | AUDIO\MOB_63G.WAV 1024 | AUDIO\MOB_63H.WAV 1025 | AUDIO\MOB_63I.WAV 1026 | AUDIO\MOB_63J.WAV 1027 | AUDIO\MOB_66A.WAV 1028 | AUDIO\MOB_66B.WAV 1029 | AUDIO\MOB_68A.WAV 1030 | AUDIO\MOB_68B.WAV 1031 | AUDIO\MOB_68C.WAV 1032 | AUDIO\MOB_68D.WAV 1033 | AUDIO\MOB_70A.WAV 1034 | AUDIO\MOB_70B.WAV 1035 | AUDIO\MOB_71A.WAV 1036 | AUDIO\MOB_71B.WAV 1037 | AUDIO\MOB_71C.WAV 1038 | AUDIO\MOB_71D.WAV 1039 | AUDIO\MOB_71E.WAV 1040 | AUDIO\MOB_71F.WAV 1041 | AUDIO\MOB_71G.WAV 1042 | AUDIO\MOB_71H.WAV 1043 | AUDIO\MOB_71I.WAV 1044 | AUDIO\MOB_71J.WAV 1045 | AUDIO\MOB_71K.WAV 1046 | AUDIO\MOB_71L.WAV 1047 | AUDIO\MOB_71M.WAV 1048 | AUDIO\MOB_71N.WAV 1049 | AUDIO\MOB_72A.WAV 1050 | AUDIO\MOB_72B.WAV 1051 | AUDIO\MOB_72C.WAV 1052 | AUDIO\MOB_72D.WAV 1053 | AUDIO\MOB_72E.WAV 1054 | AUDIO\MOB_72F.WAV 1055 | AUDIO\MOB_72G.WAV 1056 | AUDIO\MOB_73A.WAV 1057 | AUDIO\MOB_73C.WAV 1058 | AUDIO\MOB_73D.WAV 1059 | AUDIO\MOB_73F.WAV 1060 | AUDIO\MOB_73G.WAV 1061 | AUDIO\MOB_73I.WAV 1062 | AUDIO\MOB_95A.WAV 1063 | AUDIO\MOB_96A.WAV 1064 | AUDIO\MOB_98A.WAV 1065 | AUDIO\MOB_99A.WAV 1066 | AUDIO\JOB1_1B.WAV 1067 | AUDIO\JOB1_1C.WAV 1068 | AUDIO\JOB1_1D.WAV 1069 | AUDIO\JOB2_1B.WAV 1070 | AUDIO\JOB2_2.WAV 1071 | AUDIO\JOB2_3.WAV 1072 | AUDIO\JOB2_4.WAV 1073 | AUDIO\JOB2_5.WAV 1074 | AUDIO\JOB2_6.WAV 1075 | AUDIO\JOB2_7.WAV 1076 | AUDIO\JOB2_8.WAV 1077 | AUDIO\JOB2_9.WAV 1078 | AUDIO\JOB3_1.WAV 1079 | AUDIO\JOB3_2.WAV 1080 | AUDIO\JOB3_3.WAV 1081 | AUDIO\JOB4_1.WAV 1082 | AUDIO\JOB4_2.WAV 1083 | AUDIO\JOB4_3.WAV 1084 | AUDIO\JOB5_1.WAV 1085 | AUDIO\JOB5_2.WAV 1086 | AUDIO\JOB5_3.WAV 1087 | AUDIO\BJM1_20.WAV 1088 | AUDIO\BJM1_4.WAV 1089 | AUDIO\BJM1_5.WAV 1090 | AUDIO\MERC_39.WAV 1091 | AUDIO\MONO_1.WAV 1092 | AUDIO\MONO_2.WAV 1093 | AUDIO\MONO_3.WAV 1094 | AUDIO\MONO_4.WAV 1095 | AUDIO\MONO_5.WAV 1096 | AUDIO\MONO_6.WAV 1097 | AUDIO\MONO_7.WAV 1098 | AUDIO\MONO_8.WAV 1099 | AUDIO\MONO_9.WAV 1100 | AUDIO\MONO10.WAV 1101 | AUDIO\MONO11.WAV 1102 | AUDIO\MONO12.WAV 1103 | AUDIO\MONO13.WAV 1104 | AUDIO\MONO14.WAV 1105 | AUDIO\MONO15.WAV 1106 | AUDIO\MONO16.WAV 1107 | AUDIO\FUD_01.WAV 1108 | AUDIO\FUD_02.WAV 1109 | AUDIO\FUD_03.WAV 1110 | AUDIO\FUD_04.WAV 1111 | AUDIO\FUD_05.WAV 1112 | AUDIO\FUD_06.WAV 1113 | AUDIO\FUD_07.WAV 1114 | AUDIO\FUD_08.WAV 1115 | AUDIO\FUD_09.WAV 1116 | AUDIO\FUD_10.WAV 1117 | AUDIO\FUD_11.WAV 1118 | AUDIO\FUD_12.WAV 1119 | AUDIO\FUD_13.WAV 1120 | AUDIO\FUD_14.WAV 1121 | AUDIO\FUD_15.WAV 1122 | AUDIO\FUD_16.WAV 1123 | AUDIO\FUD_17.WAV 1124 | AUDIO\FUD_18.WAV 1125 | AUDIO\FUD_19.WAV 1126 | AUDIO\FUD_20.WAV 1127 | AUDIO\BURG_01.WAV 1128 | AUDIO\BURG_02.WAV 1129 | AUDIO\BURG_03.WAV 1130 | AUDIO\BURG_04.WAV 1131 | AUDIO\BURG_05.WAV 1132 | AUDIO\BURG_06.WAV 1133 | AUDIO\BURG_07.WAV 1134 | AUDIO\BURG_08.WAV 1135 | AUDIO\BURG_09.WAV 1136 | AUDIO\BURG_10.WAV 1137 | AUDIO\BURG_11.WAV 1138 | AUDIO\BURG_12.WAV 1139 | AUDIO\CRUST01.WAV 1140 | AUDIO\CRUST02.WAV 1141 | AUDIO\CRUST03.WAV 1142 | AUDIO\CRUST04.WAV 1143 | AUDIO\CRUST05.WAV 1144 | AUDIO\CRUST06.WAV 1145 | AUDIO\CRUST07.WAV 1146 | AUDIO\CRUST08.WAV 1147 | AUDIO\CRUST09.WAV 1148 | AUDIO\BAND_01.WAV 1149 | AUDIO\BAND_02.WAV 1150 | AUDIO\BAND_03.WAV 1151 | AUDIO\BAND_04.WAV 1152 | AUDIO\BAND_05.WAV 1153 | AUDIO\BAND_06.WAV 1154 | AUDIO\BAND_07.WAV 1155 | AUDIO\BAND_08.WAV 1156 | AUDIO\SHAFT01.WAV 1157 | AUDIO\SHAFT02.WAV 1158 | AUDIO\SHAFT03.WAV 1159 | AUDIO\SHAFT04.WAV 1160 | AUDIO\SHAFT05.WAV 1161 | AUDIO\SHAFT06.WAV 1162 | AUDIO\SHAFT07.WAV 1163 | AUDIO\SHAFT08.WAV 1164 | AUDIO\PISS_01.WAV 1165 | AUDIO\PISS_02.WAV 1166 | AUDIO\PISS_03.WAV 1167 | AUDIO\PISS_04.WAV 1168 | AUDIO\PISS_05.WAV 1169 | AUDIO\PISS_06.WAV 1170 | AUDIO\PISS_07.WAV 1171 | AUDIO\PISS_08.WAV 1172 | AUDIO\PISS_09.WAV 1173 | AUDIO\PISS_10.WAV 1174 | AUDIO\PISS_11.WAV 1175 | AUDIO\PISS_12.WAV 1176 | AUDIO\PISS_13.WAV 1177 | AUDIO\PISS_14.WAV 1178 | AUDIO\PISS_15.WAV 1179 | AUDIO\PISS_16.WAV 1180 | AUDIO\PISS_17.WAV 1181 | AUDIO\PISS_18.WAV 1182 | AUDIO\PISS_19.WAV 1183 | AUDIO\GIMME01.WAV 1184 | AUDIO\GIMME02.WAV 1185 | AUDIO\GIMME03.WAV 1186 | AUDIO\GIMME04.WAV 1187 | AUDIO\GIMME05.WAV 1188 | AUDIO\GIMME06.WAV 1189 | AUDIO\GIMME07.WAV 1190 | AUDIO\GIMME08.WAV 1191 | AUDIO\GIMME09.WAV 1192 | AUDIO\GIMME10.WAV 1193 | AUDIO\GIMME11.WAV 1194 | AUDIO\GIMME12.WAV 1195 | AUDIO\GIMME13.WAV 1196 | AUDIO\GIMME14.WAV 1197 | AUDIO\GIMME15.WAV 1198 | AUDIO\BUST_01.WAV 1199 | AUDIO\BUST_02.WAV 1200 | AUDIO\BUST_03.WAV 1201 | AUDIO\BUST_04.WAV 1202 | AUDIO\BUST_05.WAV 1203 | AUDIO\BUST_06.WAV 1204 | AUDIO\BUST_07.WAV 1205 | AUDIO\BUST_08.WAV 1206 | AUDIO\BUST_09.WAV 1207 | AUDIO\BUST_10.WAV 1208 | AUDIO\BUST_11.WAV 1209 | AUDIO\BUST_12.WAV 1210 | AUDIO\BUST_13.WAV 1211 | AUDIO\BUST_14.WAV 1212 | AUDIO\BUST_15.WAV 1213 | AUDIO\BUST_16.WAV 1214 | AUDIO\BUST_17.WAV 1215 | AUDIO\BUST_18.WAV 1216 | AUDIO\BUST_19.WAV 1217 | AUDIO\BUST_20.WAV 1218 | AUDIO\BUST_21.WAV 1219 | AUDIO\BUST_22.WAV 1220 | AUDIO\BUST_23.WAV 1221 | AUDIO\BUST_24.WAV 1222 | AUDIO\BUST_25.WAV 1223 | AUDIO\BUST_26.WAV 1224 | AUDIO\BUST_27.WAV 1225 | AUDIO\BUST_28.WAV 1226 | -------------------------------------------------------------------------------- /audio_samples.rc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CookiePLMonster/audio-samples/b72da42e0c4741ee0cb7485411d1d6f74182a288/audio_samples.rc -------------------------------------------------------------------------------- /audio_samples.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 14.0.25420.1 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "audio_samples", "audio_samples.vcxproj", "{2D6A277E-DE43-4D07-BDB2-12DC0D455BD4}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|x86 = Debug|x86 11 | Release|x86 = Release|x86 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {2D6A277E-DE43-4D07-BDB2-12DC0D455BD4}.Debug|x86.ActiveCfg = Debug|Win32 15 | {2D6A277E-DE43-4D07-BDB2-12DC0D455BD4}.Debug|x86.Build.0 = Debug|Win32 16 | {2D6A277E-DE43-4D07-BDB2-12DC0D455BD4}.Release|x86.ActiveCfg = Release|Win32 17 | {2D6A277E-DE43-4D07-BDB2-12DC0D455BD4}.Release|x86.Build.0 = Release|Win32 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | EndGlobal 23 | -------------------------------------------------------------------------------- /audio_samples.vcxproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | 14 | {2D6A277E-DE43-4D07-BDB2-12DC0D455BD4} 15 | audio_samples 16 | 8.1 17 | 18 | 19 | 20 | DynamicLibrary 21 | true 22 | v141_xp 23 | Unicode 24 | 25 | 26 | DynamicLibrary 27 | false 28 | v141_xp 29 | true 30 | Unicode 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | .asi 46 | 47 | 48 | .asi 49 | 50 | 51 | 52 | Level4 53 | Disabled 54 | true 55 | _DEBUG;%(PreprocessorDefinitions) 56 | NoExtensions 57 | Fast 58 | /Zc:threadSafeInit- /std:c++latest %(AdditionalOptions) 59 | 60 | 61 | Windows 62 | 63 | 64 | 65 | 66 | Level4 67 | MaxSpeed 68 | true 69 | true 70 | true 71 | AnySuitable 72 | Speed 73 | NDEBUG;%(PreprocessorDefinitions) 74 | true 75 | MultiThreaded 76 | NoExtensions 77 | Fast 78 | /Zc:threadSafeInit- /std:c++latest %(AdditionalOptions) 79 | 80 | 81 | true 82 | true 83 | Windows 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /audio_samples.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | Source Files 23 | 24 | 25 | 26 | 27 | Header Files 28 | 29 | 30 | Header Files 31 | 32 | 33 | Header Files 34 | 35 | 36 | 37 | 38 | Resource Files 39 | 40 | 41 | -------------------------------------------------------------------------------- /dllmain.cpp: -------------------------------------------------------------------------------- 1 | #include "Patterns.h" 2 | 3 | #include "DelimStringReader.h" 4 | 5 | #define WIN32_LEAN_AND_MEAN 6 | #define NOMINMAX 7 | #include 8 | 9 | void PatchStreams( char* streams, uint32_t count ) 10 | { 11 | const size_t SCRATCH_PAD_SIZE = 32767; 12 | const size_t MAX_ENTRY_SIZE = 24; 13 | 14 | DelimStringReader reader( SCRATCH_PAD_SIZE ); 15 | 16 | GetPrivateProfileSectionA( "Samples", reader.GetBuffer(), reader.GetSize(), "audio/audio-samples.ini" ); 17 | 18 | uint32_t entriesRead = 0; 19 | size_t entryLength = 0; 20 | 21 | while ( const char* str = reader.GetString( &entryLength ) ) 22 | { 23 | if ( entryLength <= MAX_ENTRY_SIZE ) 24 | { 25 | strcpy_s( streams, MAX_ENTRY_SIZE+1, str ); 26 | } 27 | streams += MAX_ENTRY_SIZE+1; 28 | if ( ++entriesRead >= count ) break; 29 | } 30 | } 31 | 32 | BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved) 33 | { 34 | (void)hModule; 35 | (void)lpReserved; 36 | 37 | if ( reason == DLL_PROCESS_ATTACH) 38 | { 39 | using namespace hook; 40 | 41 | char* streamNames = *get_pattern( "8D 0C 49 01 C1 8D 44 24 04 81 C1", 11 ); 42 | auto streamsCountVC = pattern( "0F 84 D5 00 00 00 81 FD ? ? ? ? 0F 83 C9 00 00 00" ); 43 | auto streamsCountIII = pattern( "0F 84 2E 03 00 00 80 BC 24 1C 01 00 00" ); 44 | 45 | uint32_t numStreams; 46 | if ( !streamsCountIII.count_hint(1).empty() ) 47 | numStreams = *streamsCountIII.get_first(13); 48 | else if ( !streamsCountVC.count_hint(1).empty() ) 49 | numStreams = *streamsCountVC.get_first(8); 50 | else 51 | return FALSE; // Not III nor VC? 52 | 53 | PatchStreams( streamNames, numStreams ); 54 | } 55 | return TRUE; 56 | } -------------------------------------------------------------------------------- /resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by audio_samples.rc 4 | 5 | // Next default values for new objects 6 | // 7 | #ifdef APSTUDIO_INVOKED 8 | #ifndef APSTUDIO_READONLY_SYMBOLS 9 | #define _APS_NEXT_RESOURCE_VALUE 101 10 | #define _APS_NEXT_COMMAND_VALUE 40001 11 | #define _APS_NEXT_CONTROL_VALUE 1001 12 | #define _APS_NEXT_SYMED_VALUE 101 13 | #endif 14 | #endif 15 | --------------------------------------------------------------------------------