Disable unstable traffic scorer hook

This commit is contained in:
2026-06-26 20:49:47 -05:00
parent eebd857f41
commit d68a8745f0
6 changed files with 287 additions and 14 deletions
+25 -4
View File
@@ -26,6 +26,21 @@ and test which fields the native planner actually consumes.
## Current Implementation ## Current Implementation
Current active work is a RED4ext shim under `red4ext/EdgeWeightGPS`. It has
confirmed the world-map GPS route path runs through the native async traffic
route pipeline, not the script-facing `RunGPSQuery`/`UpdateGPSQuery` helpers.
The shim can log the query lifecycle, async traffic result handoff, and route
postprocess stages.
An experimental traffic candidate scorer hook at RVA `0x8d46cc` proved the game
does consult traffic lane flags while selecting route/projection candidates:
highway, road, and pavement flags were visible live and the hook changed their
scores. That detour currently crashes during load, so it is disabled by default
in source and disabled in the local game install as `EdgeWeightGPS.dll.disabled`.
It should be treated as evidence and an RE lead, not a playable mod.
The older data-only tooling remains in the repo for reference:
This repo currently contains WolvenKit-export patchers: This repo currently contains WolvenKit-export patchers:
```bash ```bash
@@ -49,8 +64,8 @@ weighting.
`patch_lane_connections.py` patches `all.lane_connections` by raising `patch_lane_connections.py` patches `all.lane_connections` by raising
highway-enter/stay edge probabilities and lowering competing non-highway exits. highway-enter/stay edge probabilities and lowering competing non-highway exits.
That candidate is staged as an experimental archive but has not yet been proven That candidate loaded in game, but live testing did not show a GPS routing
to affect GPS routing. change.
After patching, deserialize the JSON back into CR2W and pack the resulting After patching, deserialize the JSON back into CR2W and pack the resulting
resources into an archive. resources into an archive.
@@ -71,9 +86,15 @@ A conservative speed archive, an aggressive speed archive, and a connection
probability archive were built from the local Flatpak Steam Phantom Liberty probability archive were built from the local Flatpak Steam Phantom Liberty
install. All `zz_edge` archives are currently disabled in the game folder. install. All `zz_edge` archives are currently disabled in the game folder.
The RED4ext plugin is also currently disabled for normal play:
```text
Cyberpunk 2077/red4ext/plugins/EdgeWeightGPS/EdgeWeightGPS.dll.disabled
```
```text ```text
Cyberpunk 2077/archive/pc/mod/zz_edge_weight_gps_highway_probability.archive.disabled Cyberpunk 2077/archive/pc/mod/zz_edge_weight_gps_highway_probability.archive.disabled
``` ```
Build outputs are ignored by git. Experimental archives should be enabled one at Build outputs are ignored by git. Experimental archives and RED4ext DLL builds
a time and tested from a cold boot. should be enabled one at a time and tested from a cold boot.
+86 -9
View File
@@ -708,13 +708,96 @@ The patch targets the EP1 traffic resource because Phantom Liberty is installed.
On a non-PL install, the basegame archive resource would need to be patched On a non-PL install, the basegame archive resource would need to be patched
instead. instead.
## Native Async Traffic Route Pipeline
The later RED4ext probes moved the active lead away from journal/mappin fanout
and into the native async traffic route pipeline.
The useful runtime path is:
```text
GPS query dispatch 0x70a570
traffic request enqueue 0x8d17d8
traffic result take 0x709d5c
route-record conversion 0x44a398
route postprocess 0x44830c
```
`0x8d17d8` enqueues work into the traffic route service. `0x709d5c` later takes
the finished result from the service result table, and `0x44830c` postprocesses
the traffic result into the path object consumed by the game. Route records
captured at this stage matched `worldTrafficLanePersistent.nodeRefHash` values
from `all.traffic_persistent`, which confirms that the displayed/player GPS path
is backed by the traffic lane graph even though `maxSpeed` and connection
probability patches did not affect route choice.
Static disassembly found a small traffic candidate scorer at `0x8d46cc`:
```text
score ~= sqrt(candidate + 0x08)
+ 2 * abs(candidate_z-ish - reference_z-ish)
```
It reads lane flags from `[candidate_lane + 0x88]` and branches on
`query + 0x41`:
- `query41 != 0`: pavement lanes (`0x0008`) get a vanilla `+20.0` penalty.
- `query41 == 0`: road-flagged lanes (`0x0010`) get a vanilla `*1.75`
penalty and caller `0x8d4630` applies an additional geometry normalization.
Only two direct callers reach this scorer:
```text
0x8d4568 -> 0x8d46cc
0x8d466f -> 0x8d46cc
```
Both iterate 0x30-byte candidate records and keep the lowest score. This makes
`0x8d46cc` a bounded candidate/projection selector, not the full city-wide graph
search loop.
An experimental hook multiplied the returned score by lane flag:
- highway: `0.35`
- road: `0.70`
- GPSOnly: `1.35`
- pavement: `2.75`
- other: `1.50`
Live logging proved the hook was attached and the corrected mode check was
active:
```text
pavement query41=1 base=37.854 multiplier=2.750 result=104.099
road query41=1 base=23.986 multiplier=0.700 result=16.790
highway query41=1 base=39.640 multiplier=0.350 result=13.874
```
However, that detour crashed during the load-time GPS warmup. The crash report
was an access violation reading `0x71`, and the crash reproduced until the
RED4ext plugin was disabled. The hook is therefore disabled by default in source
(`kEnableGpsTrafficEdgeWeightPatch = false`) and the local installed DLL is
renamed to `EdgeWeightGPS.dll.disabled`.
The main takeaway is still valuable: traffic lane flags are available in native
route-side code, and `0x8d46cc` is an excellent landmark. It is not yet a safe
playable patch point. The next native work should avoid a full detour of this
hot scorer and instead look for either:
- the broader search/expansion loop that feeds candidates into this selector
- an inline patch around the vanilla constants/branches if the selector proves
sufficient
- a safer result-stage rewrite only if upstream weighting cannot be patched
without desynchronizing the planner and renderer
## Future Improvements ## Future Improvements
Better versions of this mod could: Better versions of this mod could:
- hook the native destination-tracking handoff after the concrete mappin-system - identify the broader async traffic route search/expansion loop around the
method is identified `0x8d25xx` to `0x8d49xx` cluster
- trace the downstream GPS update that consumes the tracked mappin - replace the crashing `0x8d46cc` detour with a narrower inline patch or a
safer caller-side hook
- locate any native or baked edge-cost data not exposed in RTTI - locate any native or baked edge-cost data not exposed in RTTI
- inspect `GPSOnly` connector lanes if a later native trace proves they are - inspect `GPSOnly` connector lanes if a later native trace proves they are
consumed by the player GPS consumed by the player GPS
@@ -722,9 +805,3 @@ Better versions of this mod could:
- generate a diff report of every changed lane with flags, length, speed, and - generate a diff report of every changed lane with flags, length, speed, and
graph component graph component
- ship multiple archives only if a data patch is proven to affect routing - ship multiple archives only if a data patch is proven to affect routing
The next practical runtime step is no longer broad map/mappin logging. The
installed RED4ext shim now hooks `JournalManager.TrackEntry` directly and dumps
the listener array that native `TrackEntry` calls through. A short route-plotting
run should identify which native listener consumes tracked quest/objective
changes; that listener is the next focused static-disassembly target.
@@ -0,0 +1,142 @@
Version=1
EventType=REDEngineErrorReport
EventTime=0
ReportIdentifier=ffffffff-ffffffff-00000001-00000000
Sig[0].Name=StackHash
Sig[0].Value=0x0000000000000000
Sig[1].Name=ErrorReason
Sig[1].Value=Unhandled exception
Sig[2].Name=InternalVersion
Sig[2].Value=3.0.5294808 P4CL: 9778208 Stream: //R6.Root/R6.Release
DynamicSig[1].Name=OS Version
DynamicSig[1].Value=10.0.19045.2.0.0.0.1
LoadedModule[0]=Cyberpunk2077.exe
LoadedModule[1]=ntdll.dll
LoadedModule[2]=kernel32.dll
LoadedModule[3]=kernelbase.dll
LoadedModule[4]=USER32.dll
LoadedModule[5]=advapi32.dll
LoadedModule[6]=msvcrt.dll
LoadedModule[7]=rpcrt4.dll
LoadedModule[8]=cryptbase.dll
LoadedModule[9]=ucrtbase.dll
LoadedModule[10]=sechost.dll
LoadedModule[11]=gdi32.dll
LoadedModule[12]=win32u.dll
LoadedModule[13]=SHELL32.dll
LoadedModule[14]=shlwapi.dll
LoadedModule[15]=shcore.dll
LoadedModule[16]=dbghelp.dll
LoadedModule[17]=sl.interposer.dll
LoadedModule[18]=ole32.dll
LoadedModule[19]=combase.dll
LoadedModule[20]=coml2.dll
LoadedModule[21]=MSVCP140.dll
LoadedModule[22]=VCRUNTIME140.dll
LoadedModule[23]=VCRUNTIME140_1.dll
LoadedModule[24]=REDGalaxy64.dll
LoadedModule[25]=WS2_32.dll
LoadedModule[26]=CRYPT32.dll
LoadedModule[27]=bcrypt.dll
LoadedModule[28]=WININET.dll
LoadedModule[29]=mpr.dll
LoadedModule[30]=IPHLPAPI.DLL
LoadedModule[31]=dnsapi.dll
LoadedModule[32]=nsi.dll
LoadedModule[33]=MSWSOCK.dll
LoadedModule[34]=libxell.dll
LoadedModule[35]=dxgi.dll
LoadedModule[36]=SETUPAPI.dll
LoadedModule[37]=cfgmgr32.dll
LoadedModule[38]=VERSION.dll
LoadedModule[39]=libxess_fg.dll
LoadedModule[40]=XINPUT9_1_0.dll
LoadedModule[41]=libxess.dll
LoadedModule[42]=bink2w64.dll
LoadedModule[43]=WINMM.dll
LoadedModule[44]=redlexer_native.dll
LoadedModule[45]=PhysX3Common_x64.dll
LoadedModule[46]=PhysX3CharacterKinematic_x64.dll
LoadedModule[47]=PxFoundation_x64.dll
LoadedModule[48]=PhysX3Cooking_x64.dll
LoadedModule[49]=PhysX3_x64.dll
LoadedModule[50]=ffx_backend_dx12_x64.dll
LoadedModule[51]=ffx_fsr3_x64.dll
LoadedModule[52]=ffx_fsr3upscaler_x64.dll
LoadedModule[53]=ffx_opticalflow_x64.dll
LoadedModule[54]=ffx_frameinterpolation_x64.dll
LoadedModule[55]=libcurl.dll
LoadedModule[56]=WLDAP32.dll
LoadedModule[57]=Normaliz.dll
LoadedModule[58]=icuin.dll
LoadedModule[59]=icuuc.dll
LoadedModule[60]=icudt.dll
LoadedModule[61]=POWRPROF.dll
LoadedModule[62]=oo2ext_7_win64.dll
LoadedModule[63]=HID.DLL
LoadedModule[64]=amd_ags_x64.dll
LoadedModule[65]=vulkan-1.dll
LoadedModule[66]=winevulkan.dll
LoadedModule[67]=OLEAUT32.dll
LoadedModule[68]=imm32.dll
LoadedModule[69]=VERSION.dll
LoadedModule[70]=cyber_engine_tweaks.asi
LoadedModule[71]=MSVCP140_ATOMIC_WAIT.dll
LoadedModule[72]=D3DCOMPILER_47.dll
LoadedModule[73]=winmm.dll
LoadedModule[74]=msacm32.dll
LoadedModule[75]=RED4ext.dll
LoadedModule[76]=ArchiveXL.dll
LoadedModule[77]=Codeware.dll
LoadedModule[78]=EdgeWeightGPS.dll
LoadedModule[79]=input_loader.dll
LoadedModule[80]=mod_settings.dll
LoadedModule[81]=NewGamePlus.dll
LoadedModule[82]=RedData.dll
LoadedModule[83]=RedFileSystem.dll
LoadedModule[84]=TweakXL.dll
LoadedModule[85]=secur32.dll
LoadedModule[86]=Kerberos.dll
LoadedModule[87]=MSV1_0.dll
LoadedModule[88]=netapi32.dll
LoadedModule[89]=netutils.dll
LoadedModule[90]=wbemprox.dll
LoadedModule[91]=winspool.drv
LoadedModule[92]=compstui.dll
LoadedModule[93]=comctl32.dll
LoadedModule[94]=winex11.drv
LoadedModule[95]=uxtheme.dll
LoadedModule[96]=GameServicesSteam.dll
LoadedModule[97]=steam_api64.dll
LoadedModule[98]=netprofm.dll
LoadedModule[99]=steamclient64.dll
LoadedModule[100]=lsteamclient.dll
LoadedModule[101]=imagehlp.dll
LoadedModule[102]=PSAPI.DLL
LoadedModule[103]=gameoverlayrenderer64.dll
LoadedModule[104]=cryptnet.dll
LoadedModule[105]=WINTRUST.DLL
LoadedModule[106]=rsaenh.dll
LoadedModule[107]=GfnRuntimeSdk.dll
LoadedModule[108]=gdiplus.dll
LoadedModule[109]=scc_lib.dll
LoadedModule[110]=bcryptprimitives.dll
LoadedModule[111]=CChromaEditorLibrary64.dll
LoadedModule[112]=mfc140u.dll
LoadedModule[113]=msasn1.dll
LoadedModule[114]=wldp.dll
LoadedModule[115]=wineopenxr.dll
LoadedModule[116]=sl.common.dll
LoadedModule[117]=d3d12.dll
LoadedModule[118]=sl.pcl.dll
LoadedModule[119]=sl.reflex.dll
LoadedModule[120]=GFSDK_Aftermath_Lib.x64.dll
LoadedModule[121]=d3d12core.dll
LoadedModule[122]=amdxc64.dll
LoadedModule[123]=amd_fidelityfx_dx12.dll
LoadedModule[124]=mmdevapi.dll
LoadedModule[125]=winepulse.drv
LoadedModule[126]=winealsa.drv
LoadedModule[127]=Wtsapi32.dll
LoadedModule[128]=xinput1_4.dll
AppName=Cyberpunk2077.exe
@@ -0,0 +1,4 @@
Error reason: Unhandled exception
Expression: EXCEPTION_ACCESS_VIOLATION (0xC0000005)
Message: The thread attempted to read inaccessible data at 0x71.
File: <Unknown>(0)
@@ -0,0 +1,29 @@
2026-06-23 03:15:06.000 +0ms EdgeWeightGPS Main reason=Load handle=0x6ffff0740000 sdk=0x7f3a5c38 runtime=2.3.1
2026-06-23 03:15:06.001 +1ms registered Running game-state callbacks
2026-06-23 03:15:06.009 +9ms hook attach RunGPSQuery body 0x29bd128 target=0x1429bd128 rva=0x29bd128 result=ok original=0x1018c0480
2026-06-23 03:15:06.017 +17ms hook attach UpdateGPSQuery body 0x29bd254 target=0x1429bd254 rva=0x29bd254 result=ok original=0x1018c04e0
2026-06-23 03:15:06.024 +24ms hook attach GPSQuerySubmit 0x70a42c target=0x14070a42c rva=0x70a42c result=ok original=0x1018c0540
2026-06-23 03:15:06.032 +32ms hook attach GPSQueryDispatch 0x70a570 target=0x14070a570 rva=0x70a570 result=ok original=0x1018c05a0
2026-06-23 03:15:06.039 +39ms hook attach GPSQueryResultFetch 0x7094b8 target=0x1407094b8 rva=0x7094b8 result=ok original=0x1018c0600
2026-06-23 03:15:06.046 +46ms hook attach GPSQueryStatus 0xaa5704 target=0x140aa5704 rva=0xaa5704 result=ok original=0x1018c0660
2026-06-23 03:15:06.054 +54ms hook attach GPSDispatchAdvance 0x8d17d8 target=0x1408d17d8 rva=0x8d17d8 result=ok original=0x1018c06c0
2026-06-23 03:15:06.062 +62ms hook attach GPSTrafficResultTake 0x709d5c target=0x140709d5c rva=0x709d5c result=ok original=0x1018c0720
2026-06-23 03:15:06.068 +68ms hook attach GPSRoutePostprocess 0x44830c target=0x14044830c rva=0x44830c result=ok original=0x1018c0780
2026-06-23 03:15:06.075 +75ms hook attach GPSTrafficEdgeScore 0x8d46cc target=0x1408d46cc rva=0x8d46cc result=ok original=0x1018c07e0
2026-06-23 03:15:26.225 +20225ms GameState Running OnEnter app=0x31fb80
2026-06-23 03:15:26.307 +20307ms GameState Running OnUpdate app=0x31fb80 count=0
2026-06-23 03:15:26.314 +20314ms GameState Running OnUpdate app=0x31fb80 count=1
2026-06-23 03:15:26.321 +20321ms GameState Running OnUpdate app=0x31fb80 count=2
2026-06-23 03:15:26.328 +20328ms GameState Running OnUpdate app=0x31fb80 count=3
2026-06-23 03:15:26.335 +20335ms GameState Running OnUpdate app=0x31fb80 count=4
2026-06-23 03:16:03.472 +56472ms hook GPSRoutePostprocess 0x44830c call=0 scale=0.5 outPath=0x66b8f460 trafficResult=0x66b8f560 trafficResult_count0c=3/0x3 trafficResult_records10=0x66b8f6a0 trafficResult_u2c=0/0x0 trafficResult_u30=0/0x0 trafficResult_u34=0/0x0 trafficResult_records10_raw=0064a343010000000100000000000000181b10ba050000000200000000000000c0f7b866000000001ec44e4001000000 routeRecords=0x66b8f430 ret_rva=0x447ba5
2026-06-23 03:16:03.474 +56474ms hook GPSRoutePostprocess result call=0 outPath_bytes20=9023d0ac01000000030000000300000060a4518e010000000400000004000000902d7fb0010000000100000001000000c8e9b242010000000000000000000000 outPath_u20=2899321744/0xacd02390 outPath_u24=1/0x1 outPath_ptr28=0x300000003 outPath_vec20_data=0x1acd02390 outPath_vec20_count=3 outPath_vec20_first=(0,1.30084,0,1.30084) outPath_vec20_last=(89.4566,0,87.1738,0) outPath_vec20s16_data=0x1acd02390 outPath_vec20s16_count=3 outPath_vec20s16_first=(0,1.30084,0,1.30084) outPath_vec20s16_last=(87.1738,0,-5.91568e-12,0) outPath_u2c=3/0x3 outPath_u30=6682682464/0x18e51a460 outPath_u30lo=2387715168/0x8e51a460 outPath_u34hi=1/0x1 outPath_ptr28_capacity30=2387715168 outPath_ptr28_count34=1 outPath_ptr28_rec40raw=<unreadable> outPath_ptr28_rec40=[0:<unreadable>] outPath_vec38_data=0x400000004 outPath_vec38_count=4 outPath_vec38_first=<unreadable> outPath_vec38_last=<unreadable> outPath_flags40=11664/0x2d90 outPath_state42=127 outPath_u48=4294967297/0x100000001 outPath_u50=5413988808/0x142b2e9c8
2026-06-23 03:16:03.474 +56474ms hook GPSRoutePostprocess 0x44830c call=1 scale=0.5 outPath=0x66b8f460 trafficResult=0x66b8f560 trafficResult_count0c=3/0x3 trafficResult_records10=0x66b8f6a0 trafficResult_u2c=0/0x0 trafficResult_u30=0/0x0 trafficResult_u34=0/0x0 trafficResult_records10_raw=0064a343010000000100000000000000a8c30fba050000000200000000000000c0f7b866000000001ec44e4001000000 routeRecords=0x66b8f430 ret_rva=0x447ba5
2026-06-23 03:16:03.476 +56476ms hook GPSRoutePostprocess result call=1 outPath_bytes20=9023d0ac0100000003000000030000005038518e01000000040000000400000050257fb0010000000100000001000000c8e9b242010000000000000000000000 outPath_u20=2899321744/0xacd02390 outPath_u24=1/0x1 outPath_ptr28=0x300000003 outPath_vec20_data=0x1acd02390 outPath_vec20_count=3 outPath_vec20_first=(0,0.0721436,0,0.0721436) outPath_vec20_last=(89.4566,0,87.1738,0) outPath_vec20s16_data=0x1acd02390 outPath_vec20s16_count=3 outPath_vec20s16_first=(0,0.0721436,0,0.0721436) outPath_vec20s16_last=(87.1738,0,-5.91568e-12,0) outPath_u2c=3/0x3 outPath_u30=6682654800/0x18e513850 outPath_u30lo=2387687504/0x8e513850 outPath_u34hi=1/0x1 outPath_ptr28_capacity30=2387687504 outPath_ptr28_count34=1 outPath_ptr28_rec40raw=<unreadable> outPath_ptr28_rec40=[0:<unreadable>] outPath_vec38_data=0x400000004 outPath_vec38_count=4 outPath_vec38_first=<unreadable> outPath_vec38_last=<unreadable> outPath_flags40=9552/0x2550 outPath_state42=127 outPath_u48=4294967297/0x100000001 outPath_u50=5413988808/0x142b2e9c8
2026-06-23 03:16:07.562 +60562ms hook GPSTrafficEdgeScore 0x8d46cc call=0 category=pavement driving=1 query41=1 laneFlags88=0xb base=37.854 multiplier=2.750 result=104.099 ctx=0x79a3f960 query=0x79a3fa00 candidate=0x1ad27f160 lane=0x15a37de8c0 ret_rva=0x8d456d
2026-06-23 03:16:07.563 +60563ms hook GPSTrafficEdgeScore 0x8d46cc call=1 category=pavement driving=1 query41=1 laneFlags88=0xb base=37.854 multiplier=2.750 result=104.099 ctx=0x79a3f960 query=0x79a3fa00 candidate=0x1ad27f190 lane=0x15a37de960 ret_rva=0x8d456d
2026-06-23 03:16:07.563 +60563ms hook GPSTrafficEdgeScore 0x8d46cc call=2 category=road driving=1 query41=1 laneFlags88=0x11 base=23.986 multiplier=0.700 result=16.790 ctx=0x79a3f960 query=0x79a3fa00 candidate=0x1ad27f1c0 lane=0x15a37dea00 ret_rva=0x8d456d
2026-06-23 03:16:07.563 +60563ms hook GPSTrafficEdgeScore 0x8d46cc call=3 category=road driving=1 query41=1 laneFlags88=0x11 base=28.956 multiplier=0.700 result=20.269 ctx=0x79a3f960 query=0x79a3fa00 candidate=0x1ad27f1f0 lane=0x15a37deaa0 ret_rva=0x8d456d
2026-06-23 03:16:07.564 +60564ms hook GPSTrafficEdgeScore 0x8d46cc call=4 category=highway driving=1 query41=1 laneFlags88=0x4011 base=39.640 multiplier=0.350 result=13.874 ctx=0x79a3f960 query=0x79a3fa00 candidate=0x1ad27f220 lane=0x15a37e4e00 ret_rva=0x8d456d
2026-06-23 03:16:07.564 +60564ms hook GPSTrafficEdgeScore 0x8d46cc call=5 category=highway driving=1 query41=1 laneFlags88=0x4011 base=37.488 multiplier=0.350 result=13.121 ctx=0x79a3f960 query=0x79a3fa00 candidate=0x1ad27f250 lane=0x15a37e4ea0 ret_rva=0x8d456d
2026-06-23 03:16:07.564 +60564ms hook GPSTrafficEdgeScore 0x8d46cc call=6 category=pavement driving=1 query41=1 laneFlags88=0xa00a base=31.869 multiplier=2.750 result=87.640 ctx=0x79a3f960 query=0x79a3fa00 candidate=0x5c3e97cc0 lane=0x15a3599060 ret_rva=0x8d4674
+1 -1
View File
@@ -102,7 +102,7 @@ constexpr bool kEnableGpsProviderClassPatchTrace = false;
constexpr bool kEnableGpsTraceHooks = true; constexpr bool kEnableGpsTraceHooks = true;
constexpr bool kEnableGpsQueryLifecycleHooks = true; constexpr bool kEnableGpsQueryLifecycleHooks = true;
constexpr bool kEnableGpsAsyncTrafficProbe = true; constexpr bool kEnableGpsAsyncTrafficProbe = true;
constexpr bool kEnableGpsTrafficEdgeWeightPatch = true; constexpr bool kEnableGpsTrafficEdgeWeightPatch = false;
constexpr bool kEnableGpsRouteJobLifecycleHooks = false; constexpr bool kEnableGpsRouteJobLifecycleHooks = false;
constexpr bool kEnableGpsRouteJobStartTrace = false; constexpr bool kEnableGpsRouteJobStartTrace = false;
constexpr bool kEnableGpsLocalSearchHooks = false; constexpr bool kEnableGpsLocalSearchHooks = false;