@ -2004,6 +2004,7 @@ BOOL FixStartMenuAnimation(LPMODULEINFO mi)
// ### Offset of bTransitioningToCortana
// ### Offset of bTransitioningToCortana
# if defined(_M_X64)
# if defined(_M_X64)
// `(CStartExperienceManager *)((char *)this - 40)` after field access
// ```
// ```
// 80 B9 ?? ?? ?? ?? 00 75 ?? 48 83 C1 D8
// 80 B9 ?? ?? ?? ?? 00 75 ?? 48 83 C1 D8
// ^^^^^^^^^^^ bTransitioningToCortana
// ^^^^^^^^^^^ bTransitioningToCortana
@ -2019,6 +2020,25 @@ BOOL FixStartMenuAnimation(LPMODULEINFO mi)
{
{
g_SMAnimationPatchOffsets . startExperienceManager_bTransitioningToCortana = g_SMAnimationPatchOffsets . startExperienceManager_IStartExperienceManager + * ( int * ) ( matchTransitioningToCortanaField + 2 ) ;
g_SMAnimationPatchOffsets . startExperienceManager_bTransitioningToCortana = g_SMAnimationPatchOffsets . startExperienceManager_IStartExperienceManager + * ( int * ) ( matchTransitioningToCortanaField + 2 ) ;
}
}
else
{
// `(CStartExperienceManager *)((char *)this - 40)` before field access
// ```
// 48 83 C1 ?? 80 B9 ?? ?? ?? ?? 00 75 ?? 41 B0 01
// ^^^^^^^^^^^ bTransitioningToCortana
// ```
// Ref: CStartExperienceManager::DimStart()
matchTransitioningToCortanaField = ( PBYTE ) FindPattern (
mi - > lpBaseOfDll ,
mi - > SizeOfImage ,
" \x48 \x83 \xC1 \x00 \x80 \xB9 \x00 \x00 \x00 \x00 \x00 \x75 \x00 \x41 \xB0 \x01 " ,
" xxx?xx????xx?xxx "
) ;
if ( matchTransitioningToCortanaField )
{
g_SMAnimationPatchOffsets . startExperienceManager_bTransitioningToCortana = * ( int * ) ( matchTransitioningToCortanaField + 6 ) ;
}
}
# elif defined(_M_ARM64)
# elif defined(_M_ARM64)
// ```
// ```
// ?? ?? ?? 39 E8 00 00 35 ?? ?? ?? ?? 01 ?? ?? 91 22 00 80 52
// ?? ?? ?? 39 E8 00 00 35 ?? ?? ?? ?? 01 ?? ?? 91 22 00 80 52
@ -2068,24 +2088,44 @@ BOOL FixStartMenuAnimation(LPMODULEINFO mi)
matchGetMonitorInformation + = 5 + * ( int * ) ( matchGetMonitorInformation + 1 ) ;
matchGetMonitorInformation + = 5 + * ( int * ) ( matchGetMonitorInformation + 1 ) ;
}
}
# elif defined(_M_ARM64)
# elif defined(_M_ARM64)
// * Pattern for 226xx
// * Pattern for 226xx, CSingleViewShellExperience* first arg *not* passed (E1 03 14 AA)
// ```
// ```
// E3 ?? 00 91 E2 ?? 00 91 E0 03 13 AA ?? ?? ?? ?? F4 03 00 2A
// A9 E4 ?? ?? ?? E3 ?? ?? 91 E2 ?? ?? 91 E0 03 13 AA ?? ?? ?? ?? ?? 03 00 2A
// ^^^^^^^^^^^
// ^^^^^^^^^^^
// ```
// ```
// Ref: CStartExperienceManager::PositionMenu()
// Ref: CStartExperienceManager::PositionMenu()
PBYTE matchGetMonitorInformation = ( PBYTE ) FindPattern (
PBYTE matchGetMonitorInformation = ( PBYTE ) FindPattern (
mi - > lpBaseOfDll ,
mi - > lpBaseOfDll ,
mi - > SizeOfImage ,
mi - > SizeOfImage ,
" \xE3 \x00 \x00 \x91 \xE2 \x00 \x00 \x91 \xE0 \x03 \x13 \xAA \x00 \x00 \x00 \x00 \xF4 \x03 \x00 \x2A " ,
" \xA9 \xE4 \x00 \x00 \x00 \x E3 \x00 \x00 \x91 \xE2 \x00 \x00 \x91 \xE0 \x03 \x13 \xAA \x00 \x00 \x00 \x00 \x00 \x03 \x00 \x2A " ,
" x?xxx?xxxxxx????x xxx "
" xx???x??xx??xxxxx????? xxx "
) ;
) ;
if ( matchGetMonitorInformation )
if ( matchGetMonitorInformation )
{
{
matchGetMonitorInformation + = 12 ;
matchGetMonitorInformation + = 17 ;
matchGetMonitorInformation = ( PBYTE ) ARM64_FollowBL ( ( DWORD * ) matchGetMonitorInformation ) ;
matchGetMonitorInformation = ( PBYTE ) ARM64_FollowBL ( ( DWORD * ) matchGetMonitorInformation ) ;
}
}
if ( ! matchGetMonitorInformation )
if ( ! matchGetMonitorInformation )
{
// * Pattern for 226xx, CSingleViewShellExperience* first arg passed (E1 03 14 AA)
// ```
// A9 E4 ?? ?? ?? E3 ?? ?? 91 E2 ?? ?? 91 E1 03 14 AA E0 03 13 AA ?? ?? ?? ?? ?? 03 00 2A
// ^^^^^^^^^^^
// ```
// Ref: CStartExperienceManager::PositionMenu()
matchGetMonitorInformation = ( PBYTE ) FindPattern (
mi - > lpBaseOfDll ,
mi - > SizeOfImage ,
" \xA9 \xE4 \x00 \x00 \x00 \xE3 \x00 \x00 \x91 \xE2 \x00 \x00 \x91 \xE1 \x03 \x14 \xAA \xE0 \x03 \x13 \xAA \x00 \x00 \x00 \x00 \x00 \x03 \x00 \x2A " ,
" xx???x??xx??xxxxxxxxx?????xxx "
) ;
if ( matchGetMonitorInformation )
{
matchGetMonitorInformation + = 21 ;
matchGetMonitorInformation = ( PBYTE ) ARM64_FollowBL ( ( DWORD * ) matchGetMonitorInformation ) ;
}
}
if ( ! matchGetMonitorInformation )
{
{
// * Pattern for 26100.1, 265, 470, 560, 670, 712, 751, 863, 1000, 1150
// * Pattern for 26100.1, 265, 470, 560, 670, 712, 751, 863, 1000, 1150
// ```
// ```
@ -2309,61 +2349,63 @@ BOOL FixStartMenuAnimation(LPMODULEINFO mi)
}
}
# elif defined(_M_ARM64)
# elif defined(_M_ARM64)
// ```
// ```
// ?? ?? ?? 34 ?? 00 80 52 ?? 8E 0A 39
// E1 03 ?? 2A ?? ?? 04 91 ?? ?? ?? ?? ?? 03 00 2A
// ^^^^^^^^^^^ Turn CBZ into B
// ```
// ```
// Perform on exactly two matches
// Check two instructions before, and NOP these:
PBYTE matchHideA = ( PBYTE ) FindPattern (
mi - > lpBaseOfDll ,
mi - > SizeOfImage ,
" \x34 \x00 \x00 \x80 \x52 \x00 \x8E \x0A \x39 " ,
" x?xxx?xxx "
) ;
PBYTE matchHideB = nullptr ;
if ( matchHideA )
{
matchHideA - = 3 ;
printf ( " [SMA] matchHideA in CStartExperienceManager::Hide() = %llX (Pattern A) \n " , matchHideA - ( PBYTE ) mi - > lpBaseOfDll ) ;
matchHideB = ( PBYTE ) FindPattern (
matchHideA + 12 ,
mi - > SizeOfImage - ( matchHideA + 12 - ( PBYTE ) mi - > lpBaseOfDll ) ,
" \x34 \x00 \x00 \x80 \x52 \x00 \x8E \x0A \x39 " ,
" x?xxx?xxx "
) ;
if ( matchHideB )
{
matchHideB - = 3 ;
printf ( " [SMA] matchHideB in CStartExperienceManager::Hide() = %llX (Pattern A) \n " , matchHideB - ( PBYTE ) mi - > lpBaseOfDll ) ;
}
}
else
{
// ```
// ```
// ?? ?? ?? 34 ?? 00 80 52 ?? 4E 0B 39
// MOV W??, #3
// ^^^^^^^^^^^ Turn CBZ into B
// STRB W??, [X??,#0x???]
// ```
// ```
// Perform on exactly two matches
// Perform on exactly two matches
matchHideA = ( PBYTE ) FindPattern (
PBYTE matchHideA = nullptr ;
PBYTE matchHideB = nullptr ;
auto findTheIfBody = [ ] ( PBYTE pAnchor ) - > PBYTE
{
// 27881.1000+ has CBNZ before us, follow it if it is.
// Otherwise, just check the two instructions before.
PBYTE pMaybeFollowed = ( PBYTE ) ARM64_FollowCBNZW ( ( DWORD * ) ( pAnchor - 4 ) ) ;
PBYTE pIfBlockBegin = pMaybeFollowed ? pMaybeFollowed : pAnchor - 8 ;
DWORD insnMovzw = * ( DWORD * ) pIfBlockBegin ;
if ( ! ARM64_IsMOVZW ( insnMovzw ) )
return nullptr ;
DWORD movzwImm16 = ARM64_ReadBitsSignExtend ( insnMovzw , 20 , 5 ) ;
if ( movzwImm16 ! = 3 )
return nullptr ;
DWORD insnStrbimm = * ( DWORD * ) ( pIfBlockBegin + 4 ) ;
if ( ! ARM64_IsSTRBIMM ( insnStrbimm ) )
return nullptr ;
return pIfBlockBegin ;
} ;
PBYTE matchHideAAfter = ( PBYTE ) FindPattern (
mi - > lpBaseOfDll ,
mi - > lpBaseOfDll ,
mi - > SizeOfImage ,
mi - > SizeOfImage ,
" \x34 \x00 \x00 \x80 \x52 \x00 \x4E \x0B \x39 " ,
" \xE1 \x0 3 \x00 \x2A \x00 \x00 \x04 \x91 \x00 \x00 \x00 \x00 \x00 \x03 \x00 \x2A " ,
" x?xxx?xxx "
" xx ?x?? xx???? ?xxx "
) ;
) ;
if ( matchHideAAfter )
{
matchHideA = findTheIfBody ( matchHideAAfter ) ;
}
if ( matchHideA )
if ( matchHideA )
{
{
matchHideA - = 3 ;
printf ( " [SMA] matchHideA in CStartExperienceManager::Hide() = %llX \n " , matchHideA - ( PBYTE ) mi - > lpBaseOfDll ) ;
printf ( " [SMA] matchHideA in CStartExperienceManager::Hide() = %llX (Pattern B) \n " , matchHideA - ( PBYTE ) mi - > lpBaseOfDll ) ;
PBYTE matchHideBAfter = ( PBYTE ) FindPattern (
matchHideB = ( PBYTE ) FindPattern (
matchHideAAfter + 16 ,
matchHideA + 12 ,
1024 ,
mi - > SizeOfImage - ( matchHideA + 12 - ( PBYTE ) mi - > lpBaseOfDll ) ,
" \xE1 \x03 \x00 \x2A \x00 \x00 \x04 \x91 \x00 \x00 \x00 \x00 \x00 \x03 \x00 \x2A " ,
" \x34 \x00 \x00 \x80 \x52 \x00 \x4E \x0B \x39 " ,
" xx?x??xx?????xxx "
" x?xxx?xxx "
) ;
) ;
if ( matchHideB )
if ( matchHideBAfter )
{
{
matchHideB - = 3 ;
matchHideB = findTheIfBody ( matchHideBAfter ) ;
printf ( " [SMA] matchHideB in CStartExperienceManager::Hide() = %llX (Pattern B) \n " , matchHideB - ( PBYTE ) mi - > lpBaseOfDll ) ;
}
}
if ( matchHideB )
{
printf ( " [SMA] matchHideB in CStartExperienceManager::Hide() = %llX \n " , matchHideB - ( PBYTE ) mi - > lpBaseOfDll ) ;
}
}
}
}
# endif
# endif
@ -2405,20 +2447,18 @@ BOOL FixStartMenuAnimation(LPMODULEINFO mi)
}
}
}
}
# elif defined(_M_ARM64)
# elif defined(_M_ARM64)
if ( VirtualProtect ( matchHideA , 4 , PAGE_EXECUTE_READWRITE , & dwOldProtect ) )
if ( VirtualProtect ( matchHideA , 8 , PAGE_EXECUTE_READWRITE , & dwOldProtect ) )
{
{
DWORD newInsn = ARM64_CBZWToB ( * ( DWORD * ) matchHideA ) ;
* ( DWORD * ) ( matchHideA + 0 ) = 0xD503201F ; // NOP
if ( newInsn )
* ( DWORD * ) ( matchHideA + 4 ) = 0xD503201F ; // NOP
* ( DWORD * ) matchHideA = newInsn ;
VirtualProtect ( matchHideA , 8 , dwOldProtect , & dwOldProtect ) ;
VirtualProtect ( matchHideA , 4 , dwOldProtect , & dwOldProtect ) ;
dwOldProtect = 0 ;
dwOldProtect = 0 ;
if ( VirtualProtect ( matchHideB , 4 , PAGE_EXECUTE_READWRITE , & dwOldProtect ) )
if ( VirtualProtect ( matchHideB , 8 , PAGE_EXECUTE_READWRITE , & dwOldProtect ) )
{
{
newInsn = ARM64_CBZWToB ( * ( DWORD * ) matchHideB ) ;
* ( DWORD * ) ( matchHideB + 0 ) = 0xD503201F ; // NOP
if ( newInsn )
* ( DWORD * ) ( matchHideB + 4 ) = 0xD503201F ; // NOP
* ( DWORD * ) matchHideB = newInsn ;
VirtualProtect ( matchHideB , 8 , dwOldProtect , & dwOldProtect ) ;
VirtualProtect ( matchHideB , 4 , dwOldProtect , & dwOldProtect ) ;
}
}
}
}
# endif
# endif
@ -3124,17 +3164,17 @@ void TryToFindTwinuiPCShellOffsets(DWORD* pOffsets)
pOffsets [ 0 ] = ( DWORD ) ( match + 5 + * ( int * ) ( match + 1 ) - pFile ) ;
pOffsets [ 0 ] = ( DWORD ) ( match + 5 + * ( int * ) ( match + 1 ) - pFile ) ;
}
}
# elif defined(_M_ARM64)
# elif defined(_M_ARM64)
// ?? AE 00 71 ?? ?? 00 54 ?? 06 40 F9 E3 03 ?? AA E2 03 ?? AA E1 03 ?? 2A ?? ?? ?? ??
// ?? ?? 00 71 ?? ?? 00 54 ?? ?? 40 F9 E3 03 ?? AA E2 03 ?? AA E1 03 ?? 2A ?? ?? ?? ??
// ^^^^^^^^^^^
// ^^^^^^^^^^^
// Ref: CMultitaskingViewFrame::v_WndProc()
// Ref: CMultitaskingViewFrame::v_WndProc()
PBYTE match = ( PBYTE ) FindPattern (
PBYTE match = ( PBYTE ) FindPattern (
pFile , dwSize ,
pFile , dwSize ,
" \xAE \x 00 \x71 \x00 \x00 \x00 \x54 \x00 \x06 \x40 \xF9 \xE3 \x03 \x00 \xAA \xE2 \x03 \x00 \xAA \xE1 \x03 \x00 \x2A " ,
" \x00 \x71 \x00 \x00 \x00 \x54 \x00 \x00 \x40 \xF9 \xE3 \x03 \x00 \xAA \xE2 \x03 \x00 \xAA \xE1 \x03 \x00 \x2A " ,
" xxx??xx?x xxxx?xxx?xxx?x "
" xx??xx?? xxxx?xxx?xxx?x "
) ;
) ;
if ( match )
if ( match )
{
{
match + = 23 ;
match + = 22 ;
pOffsets [ 0 ] = ( DWORD ) FileOffsetToRVA ( pFile , ( PBYTE ) ARM64_FollowBL ( ( DWORD * ) match ) - pFile ) ;
pOffsets [ 0 ] = ( DWORD ) FileOffsetToRVA ( pFile , ( PBYTE ) ARM64_FollowBL ( ( DWORD * ) match ) - pFile ) ;
}
}
# endif
# endif
@ -3146,25 +3186,25 @@ void TryToFindTwinuiPCShellOffsets(DWORD* pOffsets)
if ( ! pOffsets [ 1 ] | | pOffsets [ 1 ] = = 0xFFFFFFFF )
if ( ! pOffsets [ 1 ] | | pOffsets [ 1 ] = = 0xFFFFFFFF )
{
{
# if defined(_M_X64)
# if defined(_M_X64)
// Don't worry if this is too long, this works on 17763 and 25951
// Don't worry if this is too long, this works on 17763 ~ 27943
// 40 55 53 56 57 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B B5 ? ? ? ? 41 8B C1
// 40 55 53 56 57 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8B ? ? ? ? ? 41 8B C1
PBYTE match = ( PBYTE ) FindPattern (
PBYTE match = ( PBYTE ) FindPattern (
pFile , dwSize ,
pFile , dwSize ,
" \x40 \x55 \x53 \x56 \x57 \x41 \x54 \x41 \x55 \x41 \x56 \x41 \x57 \x48 \x8D \xAC \x24 \x00 \x00 \x00 \x00 \x48 \x81 \xEC \x00 \x00 \x00 \x00 \x48 \x8B \x05 \x00 \x00 \x00 \x00 \x48 \x33 \xC4 \x48 \x89 \x85 \x00 \x00 \x00 \x00 \x4C \x8B \xB5 \x00 \x00 \x00 \x00 \x41 \x8B \xC1 " ,
" \x40 \x55 \x53 \x56 \x57 \x41 \x54 \x41 \x55 \x41 \x56 \x41 \x57 \x48 \x8D \xAC \x24 \x00 \x00 \x00 \x00 \x48 \x81 \xEC \x00 \x00 \x00 \x00 \x48 \x8B \x05 \x00 \x00 \x00 \x00 \x48 \x33 \xC4 \x48 \x89 \x85 \x00 \x00 \x00 \x00 \x4C \x8B \x00 \x00 \x00 \x00 \x00 \x41 \x8B \xC1 " ,
" xxxxxxxxxxxxxxxxx????xxx????xxx????xxxxxx????xxx ????xxx "
" xxxxxxxxxxxxxxxxx????xxx????xxx????xxxxxx????xx? ????xxx "
) ;
) ;
if ( match )
if ( match )
{
{
pOffsets [ 1 ] = ( DWORD ) ( match - pFile ) ;
pOffsets [ 1 ] = ( DWORD ) ( match - pFile ) ;
}
}
# elif defined(_M_ARM64)
# elif defined(_M_ARM64)
// 40 F9 43 03 1C 32 E4 03 15 AA ?? ?? FF 97
// 40 F9 43 03 1C 32 E4 03 ?? AA ?? ?? FF 97
// ^^^^^^^^^^^
// ^^^^^^^^^^^
// Ref: ImmersiveContextMenuHelper::ApplyOwnerDrawToMenu()
// Ref: ImmersiveContextMenuHelper::ApplyOwnerDrawToMenu()
PBYTE match = ( PBYTE ) FindPattern (
PBYTE match = ( PBYTE ) FindPattern (
pFile , dwSize ,
pFile , dwSize ,
" \x40 \xF9 \x43 \x03 \x1C \x32 \xE4 \x03 \x15 \xAA \x00 \x00 \xFF \x97 " ,
" \x40 \xF9 \x43 \x03 \x1C \x32 \xE4 \x03 \x00 \xAA \x00 \x00 \xFF \x97 " ,
" xxxxxxxxx x??xx "
" xxxxxxxx? x??xx "
) ;
) ;
if ( match )
if ( match )
{
{
@ -3191,12 +3231,12 @@ void TryToFindTwinuiPCShellOffsets(DWORD* pOffsets)
pOffsets [ 2 ] = ( DWORD ) ( match - pFile ) ;
pOffsets [ 2 ] = ( DWORD ) ( match - pFile ) ;
}
}
# elif defined(_M_ARM64)
# elif defined(_M_ARM64)
// 7F 23 03 D5 F3 53 BF A9 FD 7B BB A9 FD 03 00 91 F3 03 00 AA F4 03 01 AA ?? ?? ?? ?? FF ?? 03 A9
// 7F 23 03 D5 F3 53 BF A9 FD 7B BB A9 FD 03 00 91 ?? 03 00 AA ?? 03 01 AA ?? ?? ?? ?? FF ?? 03 A9
// ----------- PACIBSP, don't scan for this because it's everywhere
// ----------- PACIBSP, don't scan for this because it's everywhere
PBYTE match = ( PBYTE ) FindPattern (
PBYTE match = ( PBYTE ) FindPattern (
pFile , dwSize ,
pFile , dwSize ,
" \xF3 \x53 \xBF \xA9 \xFD \x7B \xBB \xA9 \xFD \x03 \x00 \x91 \xF3 \x03 \x00 \xAA \xF4 \x03 \x01 \xAA \x00 \x00 \x00 \x00 \xFF \x00 \x03 \xA9 " ,
" \xF3 \x53 \xBF \xA9 \xFD \x7B \xBB \xA9 \xFD \x03 \x00 \x91 \x00 \x03 \x00 \xAA \x00 \x03 \x01 \xAA \x00 \x00 \x00 \x00 \xFF \x00 \x03 \xA9 " ,
" xxxxxxxxxxxxxxxxx xxx????x?xx "
" xxxxxxxxxxxx?xxx? xxx????x?xx "
) ;
) ;
if ( match )
if ( match )
{
{
@ -3224,17 +3264,32 @@ void TryToFindTwinuiPCShellOffsets(DWORD* pOffsets)
match + = 17 ;
match + = 17 ;
pOffsets [ 3 ] = ( DWORD ) ( match + 5 + * ( int * ) ( match + 1 ) - pFile ) ;
pOffsets [ 3 ] = ( DWORD ) ( match + 5 + * ( int * ) ( match + 1 ) - pFile ) ;
}
}
else
{
// 48 8B ? E8 ? ? ? ? 4C 8D 47 ? 48 8B ? 48 8B CE E8 ? ? ? ? 90
// ^^^^^^^
match = ( PBYTE ) FindPattern (
pFile , dwSize ,
" \x48 \x8B \xCB \xE8 \x00 \x00 \x00 \x00 \x4C \x8D \x47 \x00 \x48 \x8B \x00 \x48 \x8B \xCE \xE8 \x00 \x00 \x00 \x00 \x90 " ,
" xx?x????xxx?xx?xxxx????x "
) ;
if ( match )
{
match + = 18 ;
pOffsets [ 3 ] = ( DWORD ) ( match + 5 + * ( int * ) ( match + 1 ) - pFile ) ;
}
}
# elif defined(_M_ARM64)
# elif defined(_M_ARM64)
// 82 62 00 91 ?? ?? 00 91 E0 03 ?? AA ?? ?? ?? ?? 1F 20 03 D5
// ?? 0A 40 F9 ?? 02 40 F9 ?? ?? 00 F9 ?? ?? ?? ?? ?? 62 00 91 ?? ?? 00 91 E0 03 ?? AA ?? ?? ?? ?? 1F 20 03 D5
// ^^^^^^^^^^^
// ^^^^^^^^^^^
PBYTE match = ( PBYTE ) FindPattern (
PBYTE match = ( PBYTE ) FindPattern (
pFile , dwSize ,
pFile , dwSize ,
" \x82 \x62 \x00 \x91 \x00 \x00 \x00 \x91 \xE0 \x03 \x00 \xAA \x00 \x00 \x00 \x00 \x1F \x20 \x03 \xD5 " ,
" \x0A \x40 \xF9 \x00 \x02 \x40 \xF9 \x00 \x00 \x00 \xF9 \x00 \x00 \x00 \x00 \x00 \x62 \x00 \x91 \x00 \x00 \x00 \x91 \xE0 \x03 \x00 \xAA \x00 \x00 \x00 \x00 \x1F \x20 \x03 \xD5 " ,
" xxxx??xxxx?x????xxxx "
" xxx?xxx??xx?????xx x??xxxx?x????xxxx "
) ;
) ;
if ( match )
if ( match )
{
{
match + = 12 ;
match + = 27 ;
pOffsets [ 3 ] = ( DWORD ) FileOffsetToRVA ( pFile , ( PBYTE ) ARM64_FollowBL ( ( DWORD * ) match ) - pFile ) ;
pOffsets [ 3 ] = ( DWORD ) FileOffsetToRVA ( pFile , ( PBYTE ) ARM64_FollowBL ( ( DWORD * ) match ) - pFile ) ;
}
}
# endif
# endif
@ -3246,30 +3301,32 @@ void TryToFindTwinuiPCShellOffsets(DWORD* pOffsets)
if ( ! pOffsets [ 4 ] | | pOffsets [ 4 ] = = 0xFFFFFFFF )
if ( ! pOffsets [ 4 ] | | pOffsets [ 4 ] = = 0xFFFFFFFF )
{
{
# if defined(_M_X64)
# if defined(_M_X64)
// 48 8B ? E8 ? ? ? ? 48 8B D3 48 8B CF E8 ? ? ? ? 90 48 8D 56 ? 48 8B CE
// Cobalt:
// ^^^^^^^ ------------------- Non-inlined ~::final_suspend()
// 48 89 46 ? 48 8B CB E8 ? ? ? ? 48 8B D3 48 8B CF E8 ? ? ? ? 90
// ^^^^^^^
PBYTE match = ( PBYTE ) FindPattern (
PBYTE match = ( PBYTE ) FindPattern (
pFile , dwSize ,
pFile , dwSize ,
" \x48 \x8B \x00 \xE8 \x00 \x00 \x00 \x00 \x48 \x8B \xD3 \x48 \x8B \xCF \xE8 \x00 \x00 \x00 \x00 \x90 \x48 \x8D \x56 \x00 \x48 \x8B \xCE " ,
" \x48 \x89 \x46 \x00 \x48 \x8B \xCB \xE8 \x00 \x00 \x00 \x00 \x48 \x8B \xD3 \x48 \x8B \xCF \xE8 \x00 \x00 \x00 \x00 \x90 " ,
" xx?x????xxxxxxx????xxxx?xx x "
" xxx ?xxx x????xxxxxxx????x "
) ;
) ;
if ( match )
if ( match )
{
{
match + = 14 ;
match + = 18 ;
pOffsets [ 4 ] = ( DWORD ) ( match + 5 + * ( int * ) ( match + 1 ) - pFile ) ;
pOffsets [ 4 ] = ( DWORD ) ( match + 5 + * ( int * ) ( match + 1 ) - pFile ) ;
}
}
else
else
{
{
// 48 8B ? E8 ? ? ? ? 48 8B D3 48 8B CF E8 ? ? ? ? 90 48 8B 05 ? ? ? ? 48
// Nickel+:
// ^^^^^^^ ------------------- Inlined ~::final_suspend()
// 48 89 03 48 8B CB E8 ? ? ? ? 48 8B D3 48 8B CF E8 ? ? ? ? 90
// ^^^^^^^
match = ( PBYTE ) FindPattern (
match = ( PBYTE ) FindPattern (
pFile , dwSize ,
pFile , dwSize ,
" \x48 \x8B \x00 \xE8 \x00 \x00 \x00 \x00 \x48 \x8B \xD3 \x48 \x8B \xCF \xE8 \x00 \x00 \x00 \x00 \x90 \x48 \x8B \x05 \x00 \x00 \x00 \x00 \x48 " ,
" \x48 \x89 \x03 \x48 \x8B \xCB \xE8 \x00 \x00 \x00 \x00 \x48 \x8B \xD3 \x48 \x8B \xCF \xE8 \x00 \x00 \x00 \x00 \x90 " ,
" xx?x????xx xxxxx????xxxx????x "
" xxxxxxx????xxx xxxx????x "
) ;
) ;
if ( match )
if ( match )
{
{
match + = 14 ;
match + = 17 ;
pOffsets [ 4 ] = ( DWORD ) ( match + 5 + * ( int * ) ( match + 1 ) - pFile ) ;
pOffsets [ 4 ] = ( DWORD ) ( match + 5 + * ( int * ) ( match + 1 ) - pFile ) ;
}
}
}
}
@ -3333,11 +3390,11 @@ void TryToFindTwinuiPCShellOffsets(DWORD* pOffsets)
}
}
}
}
# elif defined(_M_ARM64)
# elif defined(_M_ARM64)
// F3 53 BE A9 F5 5B 01 A9 FD 7B ?? A9 FD 03 00 91 30 00 80 92 F5 03 04 AA B0 ?? 00 F9 F3 03 00 AA BF 02 00 F9 68 2E 40 F9 F6 03 03 AA B3 23 02 A9 ?? ?? 00 B5
// F3 53 BE A9 F5 5B 01 A9 FD 7B ?? A9 FD 03 00 91 30 00 80 92 ?? 03 04 AA B0 ?? 00 F9 ?? 03 00 AA ?? 02 00 F9 ?? 2E 40 F9 ?? 03 03 AA ?? 23 02 A9 ?? ?? 00 B5
PBYTE match = ( PBYTE ) FindPattern (
PBYTE match = ( PBYTE ) FindPattern (
pFile , dwSize ,
pFile , dwSize ,
" \xF3 \x53 \xBE \xA9 \xF5 \x5B \x01 \xA9 \xFD \x7B \x00 \xA9 \xFD \x03 \x00 \x91 \x30 \x00 \x80 \x92 \xF5 \x03 \x04 \xAA \xB0 \x00 \x00 \xF9 \xF3 \x03 \x00 \xAA \xBF \x02 \x00 \xF9 \x68 \x2E \x40 \xF9 \xF6 \x03 \x03 \xAA \xB3 \x23 \x02 \xA9 \x00 \x00 \x00 \xB5 " ,
" \xF3 \x53 \xBE \xA9 \xF5 \x5B \x01 \xA9 \xFD \x7B \x00 \xA9 \xFD \x03 \x00 \x91 \x30 \x00 \x80 \x92 \x00 \x03 \x04 \xAA \xB0 \x00 \x00 \xF9 \x00 \x03 \x00 \xAA \x00 \x02 \x00 \xF9 \x00 \x2E \x40 \xF9 \x00 \x03 \x03 \xAA \x00 \x23 \x02 \xA9 \x00 \x00 \x00 \xB5 " ,
" xxxxxxxxxx?xxxxxxxxxxxxxx ?x xxxxxxxxxxxxxxxxxxxxx??xx "
" xxxxxxxxxx?xxxxxxxxx?xxxx? xx? xxx? xxx? xxx? xxx? xxx??xx "
) ;
) ;
if ( match )
if ( match )
{
{
@ -3386,11 +3443,11 @@ void TryToFindTwinuiPCShellOffsets(DWORD* pOffsets)
}
}
}
}
# elif defined(_M_ARM64)
# elif defined(_M_ARM64)
// F3 53 BC A9 F5 5B 01 A9 F7 13 00 F9 F9 17 00 F9 FB 1B 00 F9 FD 7B BC A9 FD 03 00 91 FF ?? 00 D1 30 00 80 92 FB 03 04 AA
// F3 53 BC A9 F5 5B 01 A9 F7 13 00 F9 F9 17 00 F9 FB 1B 00 F9 FD 7B BC A9 FD 03 00 91 FF ?? 00 D1 30 00 80 92 ?? 03 04 AA
PBYTE match = ( PBYTE ) FindPattern (
PBYTE match = ( PBYTE ) FindPattern (
pFile , dwSize ,
pFile , dwSize ,
" \xF3 \x53 \xBC \xA9 \xF5 \x5B \x01 \xA9 \xF7 \x13 \x00 \xF9 \xF9 \x17 \x00 \xF9 \xFB \x1B \x00 \xF9 \xFD \x7B \xBC \xA9 \xFD \x03 \x00 \x91 \xFF \x00 \x00 \xD1 \x30 \x00 \x80 \x92 \xFB \x03 \x04 \xAA " ,
" \xF3 \x53 \xBC \xA9 \xF5 \x5B \x01 \xA9 \xF7 \x13 \x00 \xF9 \xF9 \x17 \x00 \xF9 \xFB \x1B \x00 \xF9 \xFD \x7B \xBC \xA9 \xFD \x03 \x00 \x91 \xFF \x00 \x00 \xD1 \x30 \x00 \x80 \x92 \x00 \x03 \x04 \xAA " ,
" xxxxxxxxxxxxxxxxxxxxxxxxxxxxx?xxxxxxx xxx "
" xxxxxxxxxxxxxxxxxxxxxxxxxxxxx?xxxxxx? xxx "
) ;
) ;
if ( match )
if ( match )
{
{