# wab32-2022-04.dll-wab32-2022-05.dll Diff

# TOC

* [Visual Chart Diff](#visual-chart-diff)
* [Metadata](#metadata)
	* [Ghidra Diff Engine](#ghidra-diff-engine)
		* [Command Line](#command-line)
	* [Binary Metadata Diff](#binary-metadata-diff)
	* [Program Options](#program-options)
	* [Diff Stats](#diff-stats)
	* [Strings](#strings)
* [Deleted](#deleted)
* [Added](#added)
* [Modified](#modified)
	* [ScMergePropValues](#scmergepropvalues)
	* [_ScCountPropsEx@16](#_sccountpropsex16)
* [Modified (No Code Changes)](#modified-no-code-changes)
	* [ULongAdd](#ulongadd)
	* [QueryInterface](#queryinterface)

# Visual Chart Diff



```mermaid

flowchart LR

ScMergePropValues-6-old<--Match 69%-->ScMergePropValues-6-new
_ScCountPropsEx16-4-old<--Match 36%-->_ScCountPropsEx16-4-new

subgraph wab32-2022-05.dll
    ScMergePropValues-6-new
_ScCountPropsEx16-4-new
    
end

subgraph wab32-2022-04.dll
    ScMergePropValues-6-old
_ScCountPropsEx16-4-old
    
end

```


```mermaid
pie showData
    title Function Matches - 100.0000%
"unmatched_funcs_len" : 0
"matched_funcs_len" : 5312
```



```mermaid
pie showData
    title Matched Function Similarity - 99.9247%
"matched_funcs_with_code_changes_len" : 2
"matched_funcs_with_non_code_changes_len" : 2
"matched_funcs_no_changes_len" : 5308
```

# Metadata

## Ghidra Diff Engine

### Command Line

#### Captured Command Line


```
ghidriff --project-location ./proj --project-name wab26926 --symbols-path ./sym --gzfs-path gzfs --threaded --log-level INFO --file-log-level INFO --log-path ghidriff.log --min-func-len 10 --gdt [] --bsim --max-ram-percent 60.0 --max-section-funcs 200 wab32-2022-04.dll wab32-2022-05.dll
```


#### Verbose Args


<details>

```
--old ['wab32-2022-04.dll'] --new [['wab32-2022-05.dll']] --engine VersionTrackingDiff --output-path ./out --summary False --project-location ./proj --project-name wab26926 --symbols-path ./sym --gzfs-path gzfs --base-address None --program-options None --threaded True --force-analysis False --force-diff False --no-symbols False --log-level INFO --file-log-level INFO --log-path ghidriff.log --va False --min-func-len 10 --use-calling-counts False --gdt [] --bsim True --bsim-full False --max-ram-percent 60.0 --print-flags False --jvm-args None --side-by-side False --max-section-funcs 200 --md-title None
```


</details>

#### Download Original PEs


```
wget https://msdl.microsoft.com/download/symbols/WAB32.DLL/8CB13113B9000/WAB32.DLL -O wab32.dll.x86.10.0.19041.1173
wget https://msdl.microsoft.com/download/symbols/WAB32.DLL/0A9D7917B9000/WAB32.DLL -O wab32.dll.x86.10.0.19041.1706
```


## Binary Metadata Diff


```diff
--- wab32-2022-04.dll Meta
+++ wab32-2022-05.dll Meta
@@ -1,44 +1,44 @@
-Program Name: wab32-2022-04.dll
+Program Name: wab32-2022-05.dll
 Language ID: x86:LE:32:default (4.6)
 Compiler ID: windows
 Processor: x86
 Endian: Little
 Address Size: 32
 Minimum Address: 10000000
 Maximum Address: ffdfffff
-# of Bytes: 750912
+# of Bytes: 751424
 # of Memory Blocks: 8
-# of Instructions: 171135
-# of Defined Data: 17421
+# of Instructions: 171212
+# of Defined Data: 17422
 # of Functions: 2656
-# of Symbols: 20810
+# of Symbols: 20811
 # of Data Types: 1549
 # of Data Type Categories: 50
 Analyzed: true
 Compiler: visualstudio:unknown
 Created With Ghidra Version: 12.0.4
-Date Created: Sat Aug 15 21:26:05 SGT 2026
+Date Created: Sat Aug 15 21:26:09 SGT 2026
 Executable Format: Portable Executable (PE)
-Executable Location: /sessions/fervent-laughing-brahmagupta/mnt/patchpalooza/ghidriff/CVE-2022-26926/wab32-2022-04.dll
-Executable MD5: 5882b62e19eafbece0dd2c370bae97e9
-Executable SHA256: 6c32f957c07a1cbe8c00111fc15bcf7feb22f6e7a11fce70d15f1f49e6425083
-FSRL: file:///sessions/fervent-laughing-brahmagupta/mnt/patchpalooza/ghidriff/CVE-2022-26926/wab32-2022-04.dll?MD5=5882b62e19eafbece0dd2c370bae97e9
+Executable Location: /sessions/fervent-laughing-brahmagupta/mnt/patchpalooza/ghidriff/CVE-2022-26926/wab32-2022-05.dll
+Executable MD5: 8223d48787013c586897cde48c0c743d
+Executable SHA256: d599488ad70404f65d2a910356d521350654a0e26a4d8a86bd9718891e8f0521
+FSRL: file:///sessions/fervent-laughing-brahmagupta/mnt/patchpalooza/ghidriff/CVE-2022-26926/wab32-2022-05.dll?MD5=8223d48787013c586897cde48c0c743d
 PDB Age: 1
 PDB File: wab32.pdb
-PDB GUID: aebbde88-c5ca-efc9-7815-a28c385fff76
+PDB GUID: 12fc3401-0986-2f06-a6b3-ee43828482bc
 PDB Loaded: true
 PDB Version: RSDS
 PE Property[CompanyName]: Microsoft Corporation
 PE Property[FileDescription]: Microsoft (R) Contacts DLL
-PE Property[FileVersion]: 10.0.19041.1173 (WinBuild.160101.0800)
+PE Property[FileVersion]: 10.0.19041.1706 (WinBuild.160101.0800)
 PE Property[InternalName]: WAB32.DLL
 PE Property[LegalCopyright]: © Microsoft Corporation. All rights reserved.
 PE Property[OriginalFilename]: WAB32.DLL
 PE Property[ProductName]: Microsoft® Windows® Operating System
-PE Property[ProductVersion]: 10.0.19041.1173
+PE Property[ProductVersion]: 10.0.19041.1706
 PE Property[Translation]: 4b00409
 Preferred Root Namespace Category: 
 RTTI Found: false
 Relocatable: true
 SectionAlignment: 4096
 Should Ask To Analyze: false

```


## Program Options


<details>
<summary>Ghidra wab32-2022-04.dll Decompiler Options</summary>


|Decompiler Option|Value|
| :---: | :---: |
|Prototype Evaluation|__fastcall/__thiscall/__stdcall|

</details>


<details>
<summary>Ghidra wab32-2022-04.dll Specification extensions Options</summary>


|Specification extensions Option|Value|
| :---: | :---: |
|FormatVersion|0|
|VersionCounter|0|

</details>


<details>
<summary>Ghidra wab32-2022-04.dll Analyzers Options</summary>


|Analyzers Option|Value|
| :---: | :---: |
|ASCII Strings|true|
|ASCII Strings.Create Strings Containing Existing Strings|true|
|ASCII Strings.Create Strings Containing References|true|
|ASCII Strings.Force Model Reload|false|
|ASCII Strings.Minimum String Length|LEN_5|
|ASCII Strings.Model File|StringModel.sng|
|ASCII Strings.Require Null Termination for String|true|
|ASCII Strings.Search Only in Accessible Memory Blocks|true|
|ASCII Strings.String Start Alignment|ALIGN_1|
|ASCII Strings.String end alignment|4|
|Aggressive Instruction Finder|false|
|Aggressive Instruction Finder.Create Analysis Bookmarks|true|
|Apply Data Archives|true|
|Apply Data Archives.Archive Chooser|[Auto-Detect]|
|Apply Data Archives.Create Analysis Bookmarks|true|
|Apply Data Archives.GDT User File Archive Path|None|
|Apply Data Archives.User Project Archive Path|None|
|Call Convention ID|true|
|Call Convention ID.Analysis Decompiler Timeout (sec)|60|
|Call-Fixup Installer|true|
|Condense Filler Bytes|false|
|Condense Filler Bytes.Filler Value|Auto|
|Condense Filler Bytes.Minimum number of sequential bytes|1|
|Create Address Tables|true|
|Create Address Tables.Allow Offcut References|false|
|Create Address Tables.Auto Label Table|false|
|Create Address Tables.Create Analysis Bookmarks|true|
|Create Address Tables.Maxmimum Pointer Distance|16777215|
|Create Address Tables.Minimum Pointer Address|4132|
|Create Address Tables.Minimum Table Size|3|
|Create Address Tables.Pointer Alignment|1|
|Create Address Tables.Relocation Table Guide|true|
|Create Address Tables.Table Alignment|4|
|Data Reference|true|
|Data Reference.Address Table Alignment|1|
|Data Reference.Address Table Minimum Size|3|
|Data Reference.Align End of Strings|false|
|Data Reference.Ascii String References|true|
|Data Reference.Create Address Tables|true|
|Data Reference.Minimum String Length|5|
|Data Reference.References to Pointers|true|
|Data Reference.Relocation Table Guide|true|
|Data Reference.Respect Execute Flag|true|
|Data Reference.Subroutine References|true|
|Data Reference.Switch Table References|false|
|Data Reference.Unicode String References|true|
|Decompiler Parameter ID|true|
|Decompiler Parameter ID.Analysis Clear Level|ANALYSIS|
|Decompiler Parameter ID.Analysis Decompiler Timeout (sec)|60|
|Decompiler Parameter ID.Commit Data Types|true|
|Decompiler Parameter ID.Commit Void Return Values|false|
|Decompiler Parameter ID.Prototype Evaluation|__fastcall/__thiscall/__stdcall|
|Decompiler Switch Analysis|true|
|Decompiler Switch Analysis.Analysis Decompiler Timeout (sec)|60|
|Demangler Microsoft|true|
|Demangler Microsoft.Apply Function Calling Conventions|true|
|Demangler Microsoft.Apply Function Signatures|true|
|Demangler Microsoft.C-Style Symbol Interpretation|FUNCTION_IF_EXISTS|
|Demangler Microsoft.Demangle Only Known Mangled Symbols|false|
|Disassemble Entry Points|true|
|Disassemble Entry Points.Respect Execute Flag|true|
|Embedded Media|true|
|Embedded Media.Create Analysis Bookmarks|true|
|External Entry References|true|
|Function ID|true|
|Function ID.Always Apply FID Labels|false|
|Function ID.Create Analysis Bookmarks|true|
|Function ID.Instruction Count Threshold|14.6|
|Function ID.Multiple Match Threshold|30.0|
|Function Start Pre Search|true|
|Function Start Pre Search.Bookmark Functions|false|
|Function Start Pre Search.Search Data Blocks|false|
|Function Start Search|true|
|Function Start Search After Code|true|
|Function Start Search After Code.Bookmark Functions|false|
|Function Start Search After Code.Search Data Blocks|false|
|Function Start Search After Data|true|
|Function Start Search After Data.Bookmark Functions|false|
|Function Start Search After Data.Search Data Blocks|false|
|Function Start Search.Bookmark Functions|false|
|Function Start Search.Search Data Blocks|false|
|Non-Returning Functions - Discovered|true|
|Non-Returning Functions - Discovered.Create Analysis Bookmarks|true|
|Non-Returning Functions - Discovered.Function Non-return Threshold|3|
|Non-Returning Functions - Discovered.Repair Flow Damage|true|
|Non-Returning Functions - Known|true|
|Non-Returning Functions - Known.Create Analysis Bookmarks|true|
|PDB MSDIA|false|
|PDB MSDIA.Search untrusted symbol servers|false|
|PDB Universal|true|
|PDB Universal.Import Source Line Info|true|
|PDB Universal.Search untrusted symbol servers|false|
|Reference|true|
|Reference.Address Table Alignment|1|
|Reference.Address Table Minimum Size|3|
|Reference.Align End of Strings|false|
|Reference.Ascii String References|true|
|Reference.Create Address Tables|true|
|Reference.Minimum String Length|5|
|Reference.References to Pointers|true|
|Reference.Relocation Table Guide|true|
|Reference.Respect Execute Flag|true|
|Reference.Subroutine References|true|
|Reference.Switch Table References|false|
|Reference.Unicode String References|true|
|Scalar Operand References|true|
|Scalar Operand References.Relocation Table Guide|true|
|Shared Return Calls|true|
|Shared Return Calls.Allow Conditional Jumps|false|
|Shared Return Calls.Assume Contiguous Functions Only|true|
|Stack|true|
|Stack.Create Local Variables|true|
|Stack.Create Param Variables|false|
|Stack.Max Threads|2|
|Subroutine References|true|
|Subroutine References.Create Thunks Early|true|
|Variadic Function Signature Override|false|
|Variadic Function Signature Override.Create Analysis Bookmarks|false|
|Windows x86 PE Exception Handling|true|
|Windows x86 PE RTTI Analyzer|true|
|Windows x86 Thread Environment Block (TEB) Analyzer|true|
|Windows x86 Thread Environment Block (TEB) Analyzer.Starting Address of the TEB||
|Windows x86 Thread Environment Block (TEB) Analyzer.Windows OS Version|Windows 7|
|WindowsPE x86 Propagate External Parameters|false|
|WindowsResourceReference|true|
|WindowsResourceReference.Create Analysis Bookmarks|true|
|X86 Function Callee Purge|true|
|x86 Constant Reference Analyzer|true|
|x86 Constant Reference Analyzer.Create Data from pointer|false|
|x86 Constant Reference Analyzer.Function parameter/return Pointer analysis|true|
|x86 Constant Reference Analyzer.Max Threads|2|
|x86 Constant Reference Analyzer.Min absolute reference|4|
|x86 Constant Reference Analyzer.Require pointer param data type|false|
|x86 Constant Reference Analyzer.Speculative reference max|256|
|x86 Constant Reference Analyzer.Speculative reference min|1024|
|x86 Constant Reference Analyzer.Stored Value Pointer analysis|true|
|x86 Constant Reference Analyzer.Trust values read from writable memory|true|

</details>


<details>
<summary>Ghidra wab32-2022-05.dll Decompiler Options</summary>


|Decompiler Option|Value|
| :---: | :---: |
|Prototype Evaluation|__fastcall/__thiscall/__stdcall|

</details>


<details>
<summary>Ghidra wab32-2022-05.dll Specification extensions Options</summary>


|Specification extensions Option|Value|
| :---: | :---: |
|FormatVersion|0|
|VersionCounter|0|

</details>


<details>
<summary>Ghidra wab32-2022-05.dll Analyzers Options</summary>


|Analyzers Option|Value|
| :---: | :---: |
|ASCII Strings|true|
|ASCII Strings.Create Strings Containing Existing Strings|true|
|ASCII Strings.Create Strings Containing References|true|
|ASCII Strings.Force Model Reload|false|
|ASCII Strings.Minimum String Length|LEN_5|
|ASCII Strings.Model File|StringModel.sng|
|ASCII Strings.Require Null Termination for String|true|
|ASCII Strings.Search Only in Accessible Memory Blocks|true|
|ASCII Strings.String Start Alignment|ALIGN_1|
|ASCII Strings.String end alignment|4|
|Aggressive Instruction Finder|false|
|Aggressive Instruction Finder.Create Analysis Bookmarks|true|
|Apply Data Archives|true|
|Apply Data Archives.Archive Chooser|[Auto-Detect]|
|Apply Data Archives.Create Analysis Bookmarks|true|
|Apply Data Archives.GDT User File Archive Path|None|
|Apply Data Archives.User Project Archive Path|None|
|Call Convention ID|true|
|Call Convention ID.Analysis Decompiler Timeout (sec)|60|
|Call-Fixup Installer|true|
|Condense Filler Bytes|false|
|Condense Filler Bytes.Filler Value|Auto|
|Condense Filler Bytes.Minimum number of sequential bytes|1|
|Create Address Tables|true|
|Create Address Tables.Allow Offcut References|false|
|Create Address Tables.Auto Label Table|false|
|Create Address Tables.Create Analysis Bookmarks|true|
|Create Address Tables.Maxmimum Pointer Distance|16777215|
|Create Address Tables.Minimum Pointer Address|4132|
|Create Address Tables.Minimum Table Size|3|
|Create Address Tables.Pointer Alignment|1|
|Create Address Tables.Relocation Table Guide|true|
|Create Address Tables.Table Alignment|4|
|Data Reference|true|
|Data Reference.Address Table Alignment|1|
|Data Reference.Address Table Minimum Size|3|
|Data Reference.Align End of Strings|false|
|Data Reference.Ascii String References|true|
|Data Reference.Create Address Tables|true|
|Data Reference.Minimum String Length|5|
|Data Reference.References to Pointers|true|
|Data Reference.Relocation Table Guide|true|
|Data Reference.Respect Execute Flag|true|
|Data Reference.Subroutine References|true|
|Data Reference.Switch Table References|false|
|Data Reference.Unicode String References|true|
|Decompiler Parameter ID|true|
|Decompiler Parameter ID.Analysis Clear Level|ANALYSIS|
|Decompiler Parameter ID.Analysis Decompiler Timeout (sec)|60|
|Decompiler Parameter ID.Commit Data Types|true|
|Decompiler Parameter ID.Commit Void Return Values|false|
|Decompiler Parameter ID.Prototype Evaluation|__fastcall/__thiscall/__stdcall|
|Decompiler Switch Analysis|true|
|Decompiler Switch Analysis.Analysis Decompiler Timeout (sec)|60|
|Demangler Microsoft|true|
|Demangler Microsoft.Apply Function Calling Conventions|true|
|Demangler Microsoft.Apply Function Signatures|true|
|Demangler Microsoft.C-Style Symbol Interpretation|FUNCTION_IF_EXISTS|
|Demangler Microsoft.Demangle Only Known Mangled Symbols|false|
|Disassemble Entry Points|true|
|Disassemble Entry Points.Respect Execute Flag|true|
|Embedded Media|true|
|Embedded Media.Create Analysis Bookmarks|true|
|External Entry References|true|
|Function ID|true|
|Function ID.Always Apply FID Labels|false|
|Function ID.Create Analysis Bookmarks|true|
|Function ID.Instruction Count Threshold|14.6|
|Function ID.Multiple Match Threshold|30.0|
|Function Start Pre Search|true|
|Function Start Pre Search.Bookmark Functions|false|
|Function Start Pre Search.Search Data Blocks|false|
|Function Start Search|true|
|Function Start Search After Code|true|
|Function Start Search After Code.Bookmark Functions|false|
|Function Start Search After Code.Search Data Blocks|false|
|Function Start Search After Data|true|
|Function Start Search After Data.Bookmark Functions|false|
|Function Start Search After Data.Search Data Blocks|false|
|Function Start Search.Bookmark Functions|false|
|Function Start Search.Search Data Blocks|false|
|Non-Returning Functions - Discovered|true|
|Non-Returning Functions - Discovered.Create Analysis Bookmarks|true|
|Non-Returning Functions - Discovered.Function Non-return Threshold|3|
|Non-Returning Functions - Discovered.Repair Flow Damage|true|
|Non-Returning Functions - Known|true|
|Non-Returning Functions - Known.Create Analysis Bookmarks|true|
|PDB MSDIA|false|
|PDB MSDIA.Search untrusted symbol servers|false|
|PDB Universal|true|
|PDB Universal.Import Source Line Info|true|
|PDB Universal.Search untrusted symbol servers|false|
|Reference|true|
|Reference.Address Table Alignment|1|
|Reference.Address Table Minimum Size|3|
|Reference.Align End of Strings|false|
|Reference.Ascii String References|true|
|Reference.Create Address Tables|true|
|Reference.Minimum String Length|5|
|Reference.References to Pointers|true|
|Reference.Relocation Table Guide|true|
|Reference.Respect Execute Flag|true|
|Reference.Subroutine References|true|
|Reference.Switch Table References|false|
|Reference.Unicode String References|true|
|Scalar Operand References|true|
|Scalar Operand References.Relocation Table Guide|true|
|Shared Return Calls|true|
|Shared Return Calls.Allow Conditional Jumps|false|
|Shared Return Calls.Assume Contiguous Functions Only|true|
|Stack|true|
|Stack.Create Local Variables|true|
|Stack.Create Param Variables|false|
|Stack.Max Threads|2|
|Subroutine References|true|
|Subroutine References.Create Thunks Early|true|
|Variadic Function Signature Override|false|
|Variadic Function Signature Override.Create Analysis Bookmarks|false|
|Windows x86 PE Exception Handling|true|
|Windows x86 PE RTTI Analyzer|true|
|Windows x86 Thread Environment Block (TEB) Analyzer|true|
|Windows x86 Thread Environment Block (TEB) Analyzer.Starting Address of the TEB||
|Windows x86 Thread Environment Block (TEB) Analyzer.Windows OS Version|Windows 7|
|WindowsPE x86 Propagate External Parameters|false|
|WindowsResourceReference|true|
|WindowsResourceReference.Create Analysis Bookmarks|true|
|X86 Function Callee Purge|true|
|x86 Constant Reference Analyzer|true|
|x86 Constant Reference Analyzer.Create Data from pointer|false|
|x86 Constant Reference Analyzer.Function parameter/return Pointer analysis|true|
|x86 Constant Reference Analyzer.Max Threads|2|
|x86 Constant Reference Analyzer.Min absolute reference|4|
|x86 Constant Reference Analyzer.Require pointer param data type|false|
|x86 Constant Reference Analyzer.Speculative reference max|256|
|x86 Constant Reference Analyzer.Speculative reference min|1024|
|x86 Constant Reference Analyzer.Stored Value Pointer analysis|true|
|x86 Constant Reference Analyzer.Trust values read from writable memory|true|

</details>

## Diff Stats



|Stat|Value|
| :---: | :---: |
|added_funcs_len|0|
|deleted_funcs_len|0|
|modified_funcs_len|4|
|added_symbols_len|0|
|deleted_symbols_len|0|
|diff_time|5.373628377914429|
|deleted_strings_len|0|
|added_strings_len|0|
|match_types|Counter({'SymbolsHash': 2648, 'ExternalsName': 460, 'ExactBytesFunctionHasher': 7, 'BSIM': 2})|
|items_to_process|4|
|diff_types|Counter({'refcount': 2, 'address': 2, 'code': 2, 'length': 2, 'called': 2, 'calling': 1, 'sig': 1})|
|unmatched_funcs_len|0|
|total_funcs_len|5312|
|matched_funcs_len|5312|
|matched_funcs_with_code_changes_len|2|
|matched_funcs_with_non_code_changes_len|2|
|matched_funcs_no_changes_len|5308|
|match_func_similarity_percent|99.9247%|
|func_match_overall_percent|100.0000%|
|first_matches|Counter({'SymbolsHash': 2648, 'ExactBytesFunctionHasher': 7, 'BSIM': 1})|



```mermaid
pie showData
    title All Matches
"SymbolsHash" : 2648
"ExternalsName" : 460
"BSIM" : 2
"ExactBytesFunctionHasher" : 7
```



```mermaid
pie showData
    title First Matches
"SymbolsHash" : 2648
"ExactBytesFunctionHasher" : 7
"BSIM" : 1
```



```mermaid
pie showData
    title Diff Stats
"added_funcs_len" : 0
"deleted_funcs_len" : 0
"modified_funcs_len" : 4
```



```mermaid
pie showData
    title Symbols
"added_symbols_len" : 0
"deleted_symbols_len" : 0
```

## Strings


*No string differences found*

# Deleted

# Added

# Modified


*Modified functions contain code changes*
## ScMergePropValues

### Match Info



|Key|wab32-2022-04.dll - wab32-2022-05.dll|
| :---: | :---: |
|diff_type|code,length,called|
|ratio|0.1|
|i_ratio|0.49|
|m_ratio|0.96|
|b_ratio|0.69|
|match_types|SymbolsHash|

### Function Meta Diff



|Key|wab32-2022-04.dll|wab32-2022-05.dll|
| :---: | :---: | :---: |
|name|ScMergePropValues|ScMergePropValues|
|fullname|ScMergePropValues|ScMergePropValues|
|refcount|18|18|
|`length`|995|1071|
|`called`|FreeBufferAndNull<br>MAPIAllocateBuffer<br>RemoveDuplicateProps<br>_ScCountPropsEx@16<br>memcpy|FreeBufferAndNull<br>MAPIAllocateBuffer<br>RemoveDuplicateProps<br>ULongAdd<br>_ScCountPropsEx@16<br>memcpy|
|calling|<details><summary>Expand for full list:<br>AddressBook::PrepareRecips<br>CABContainer::ResolveNames<br>CMailUserProp::SaveChanges<br>HrAddPrSearchKey<br>HrAddRemoveFolderFromUserFolder<br>HrCreateAdrListFromLV<br>HrMergeSelectionWithOriginal<br>HrResolveCurrentProfile<br>HrResolveOneOffs<br>HrRowToADRENTRY<br>HrShowPickUserDialog</summary>HrUpdateAdrListEntry<br>ResolveProcessResults<br>UnresolveNoCerts<br>fnAddress</details>|<details><summary>Expand for full list:<br>AddressBook::PrepareRecips<br>CABContainer::ResolveNames<br>CMailUserProp::SaveChanges<br>HrAddPrSearchKey<br>HrAddRemoveFolderFromUserFolder<br>HrCreateAdrListFromLV<br>HrMergeSelectionWithOriginal<br>HrResolveCurrentProfile<br>HrResolveOneOffs<br>HrRowToADRENTRY<br>HrShowPickUserDialog</summary>HrUpdateAdrListEntry<br>ResolveProcessResults<br>UnresolveNoCerts<br>fnAddress</details>|
|paramcount|6|6|
|address|1003665f|1003665f|
|sig|long __stdcall ScMergePropValues(ulong param_1, _SPropValue * param_2, ulong param_3, _SPropValue * param_4, ulong * param_5, _SPropValue * * param_6)|long __stdcall ScMergePropValues(ulong param_1, _SPropValue * param_2, ulong param_3, _SPropValue * param_4, ulong * param_5, _SPropValue * * param_6)|
|sym_type|Function|Function|
|sym_source|ANALYSIS|ANALYSIS|
|external|False|False|

### ScMergePropValues Called Diff


```diff
--- ScMergePropValues called
+++ ScMergePropValues called
@@ -3,0 +4 @@
+ULongAdd
```


### ScMergePropValues Diff


```diff
--- ScMergePropValues
+++ ScMergePropValues
@@ -1,266 +1,284 @@
 
 /* long __stdcall ScMergePropValues(unsigned long,struct _SPropValue *,unsigned long,struct
    _SPropValue *,unsigned long *,struct _SPropValue * *) */
 
 long ScMergePropValues(ulong param_1,_SPropValue *param_2,ulong param_3,_SPropValue *param_4,
                       ulong *param_5,_SPropValue **param_6)
 
 {
   char cVar1;
   ushort uVar2;
   undefined4 *puVar3;
-  uint uVar4;
+  int *piVar4;
   char *pcVar5;
   short sVar6;
-  undefined4 *puVar7;
+  long lVar7;
+  undefined4 *puVar8;
   int in_ECX;
-  short *psVar8;
+  short *psVar9;
   uint *in_EDX;
-  short *psVar9;
-  int iVar10;
-  size_t sVar11;
+  short *psVar10;
+  int iVar11;
+  size_t sVar12;
+  int *piVar13;
   _SPropValue *unaff_ESI;
-  undefined4 *puVar12;
-  char *pcVar13;
-  int iVar14;
+  undefined4 *puVar14;
+  char *pcVar15;
+  int iVar16;
   ulong *unaff_EDI;
-  int *piVar15;
-  int local_20;
-  int local_1c;
-  int *local_18;
-  int local_14;
-  undefined4 *local_10;
-  void *local_c;
+  int *piVar17;
+  uint local_24;
+  uint local_20;
+  int *local_1c;
+  int local_18;
+  undefined4 *local_14;
+  void *local_10;
+  int *local_c;
   undefined4 *local_8;
   
-  local_10 = (undefined4 *)0x0;
-  local_c = (void *)0x0;
-  local_14 = _ScCountPropsEx_16(in_ECX,in_EDX,1,&local_1c);
-  iVar10 = local_14;
-  puVar3 = local_8;
-  if ((-1 < local_14) &&
-     (local_14 = _ScCountPropsEx_16(param_1,(uint *)param_2,1,&local_20), iVar10 = local_14,
-     puVar3 = local_8, -1 < local_14)) {
-    local_10 = (undefined4 *)(in_ECX + param_1);
-    local_8 = local_10;
-    local_14 = MAPIAllocateBuffer(local_20 + local_1c,&local_c);
-    iVar10 = local_14;
-    puVar3 = local_8;
-    if (-1 < local_14) {
-      memcpy(local_c,in_EDX,in_ECX * 0x10);
-      memcpy((void *)((int)local_c + in_ECX * 0x10),param_2,param_1 << 4);
-      RemoveDuplicateProps(unaff_EDI,unaff_ESI);
-      puVar12 = (undefined4 *)((int)local_8 * 0x10 + (int)local_c);
-      local_10 = local_8;
-      iVar10 = local_14;
-      puVar3 = puVar12;
-      if (local_8 != (undefined4 *)0x0) {
-        piVar15 = (int *)((int)local_c + 0xc);
-        puVar7 = local_8;
-        local_8 = puVar12;
-        do {
-          puVar7 = (undefined4 *)((int)puVar7 + -1);
-          uVar2 = *(ushort *)(piVar15 + -3);
-          local_18 = piVar15;
-          if (0x1003 < uVar2) {
-            if (uVar2 < 0x101f) {
-              if (uVar2 != 0x101e) {
-                if (uVar2 == 0x1004) goto LAB_0;
-                if ((((uVar2 != 0x1005) && (uVar2 != 0x1006)) && (uVar2 != 0x1007)) &&
-                   (uVar2 != 0x1014)) goto LAB_1;
+  local_14 = (undefined4 *)0x0;
+  local_10 = (void *)0x0;
+  local_18 = _ScCountPropsEx_16(in_ECX,in_EDX,1,&local_24);
+  iVar11 = local_18;
+  puVar14 = local_8;
+  if ((-1 < local_18) &&
+     (local_18 = _ScCountPropsEx_16(param_1,(uint *)param_2,1,&local_20), iVar11 = local_18,
+     puVar14 = local_8, -1 < local_18)) {
+    local_14 = (undefined4 *)(in_ECX + param_1);
+    local_8 = local_14;
+    lVar7 = ULongAdd((ulong)&local_1c,(ulong)unaff_EDI,(ulong *)unaff_ESI);
+    piVar13 = local_1c;
+    iVar11 = local_18;
+    puVar14 = local_8;
+    if (-1 < lVar7) {
+      local_c = local_1c;
+      local_18 = MAPIAllocateBuffer((ulong)local_1c,&local_10);
+      iVar11 = local_18;
+      puVar14 = local_8;
+      if (-1 < local_18) {
+        memcpy(local_10,in_EDX,in_ECX * 0x10);
+        memcpy((void *)((int)local_10 + in_ECX * 0x10),param_2,param_1 << 4);
+        RemoveDuplicateProps(unaff_EDI,unaff_ESI);
+        puVar14 = (undefined4 *)((int)local_8 * 0x10 + (int)local_10);
+        local_14 = local_8;
+        iVar11 = local_18;
+        if (local_8 != (undefined4 *)0x0) {
+          piVar17 = (int *)((int)local_10 + 0xc);
+          puVar8 = local_8;
+          local_8 = puVar14;
+          do {
+            puVar14 = local_8;
+            puVar8 = (undefined4 *)((int)puVar8 + -1);
+            uVar2 = *(ushort *)(piVar17 + -3);
+            local_1c = piVar17;
+            if (0x1003 < uVar2) {
+              if (uVar2 < 0x101f) {
+                if (uVar2 != 0x101e) {
+                  if (uVar2 == 0x1004) goto LAB_0;
+                  if ((((uVar2 != 0x1005) && (uVar2 != 0x1006)) && (uVar2 != 0x1007)) &&
+                     (uVar2 != 0x1014)) goto LAB_1;
 LAB_2:
-                sVar11 = piVar15[-1] << 3;
-                goto LAB_3;
-              }
-              uVar4 = piVar15[-1];
-              iVar10 = *piVar15;
-              *piVar15 = (int)puVar12;
-              puVar12 = puVar12 + uVar4;
-              local_18 = (int *)0x0;
-              local_8 = puVar12;
-              if (uVar4 != 0) {
-                do {
-                  *(undefined4 **)(*piVar15 + (int)local_18 * 4) = puVar12;
-                  pcVar5 = *(char **)(iVar10 + (int)local_18 * 4);
-                  if (pcVar5 == (char *)0x0) {
-                    iVar14 = 0;
+                  sVar12 = piVar17[-1] << 3;
+                  goto LAB_3;
+                }
+                iVar11 = *piVar17;
+                piVar4 = (int *)piVar17[-1];
+                piVar13 = piVar13 + (int)piVar4;
+                *piVar17 = (int)local_8;
+                local_8 = local_8 + (int)piVar4;
+                local_1c = (int *)0x0;
+                local_c = piVar13;
+                if (piVar4 != (int *)0x0) {
+                  do {
+                    puVar14 = local_8;
+                    *(undefined4 **)(*piVar17 + (int)local_1c * 4) = local_8;
+                    pcVar5 = *(char **)(iVar11 + (int)local_1c * 4);
+                    if (pcVar5 == (char *)0x0) {
+                      iVar16 = 0;
+                    }
+                    else {
+                      pcVar15 = pcVar5;
+                      do {
+                        cVar1 = *pcVar15;
+                        pcVar15 = pcVar15 + 1;
+                      } while (cVar1 != '\0');
+                      iVar16 = (int)pcVar15 - (int)(pcVar5 + 1);
+                    }
+                    sVar12 = iVar16 + 1;
+                    memcpy(local_8,pcVar5,sVar12);
+                    local_8 = (undefined4 *)((int)puVar14 + sVar12);
+                    piVar13 = (int *)((int)local_c + sVar12);
+                    local_1c = (int *)((int)local_1c + 1);
+                    local_c = piVar13;
+                  } while (local_1c < piVar4);
+                }
+              }
+              else if (uVar2 == 0x101f) {
+                iVar11 = *piVar17;
+                piVar4 = (int *)piVar17[-1];
+                piVar13 = piVar13 + (int)piVar4;
+                *piVar17 = (int)local_8;
+                local_8 = local_8 + (int)piVar4;
+                local_1c = (int *)0x0;
+                local_c = piVar13;
+                if (piVar4 != (int *)0x0) {
+                  do {
+                    puVar14 = local_8;
+                    *(undefined4 **)(*piVar17 + (int)local_1c * 4) = local_8;
+                    psVar9 = *(short **)(iVar11 + (int)local_1c * 4);
+                    if (psVar9 == (short *)0x0) {
+                      iVar16 = 0;
+                    }
+                    else {
+                      psVar10 = psVar9;
+                      do {
+                        sVar6 = *psVar10;
+                        psVar10 = psVar10 + 1;
+                      } while (sVar6 != 0);
+                      iVar16 = (int)psVar10 - (int)(psVar9 + 1) >> 1;
+                    }
+                    sVar12 = iVar16 * 2 + 2;
+                    memcpy(local_8,psVar9,sVar12);
+                    local_8 = (undefined4 *)((int)puVar14 + sVar12);
+                    piVar13 = (int *)((int)local_c + sVar12);
+                    local_1c = (int *)((int)local_1c + 1);
+                    local_c = piVar13;
+                  } while (local_1c < piVar4);
+                }
+              }
+              else {
+                if (uVar2 == 0x1040) goto LAB_2;
+                if (uVar2 == 0x1048) {
+                  sVar12 = piVar17[-1] << 4;
+                  goto LAB_3;
+                }
+                if (uVar2 != 0x1102) goto LAB_1;
+                iVar11 = *piVar17;
+                piVar4 = (int *)piVar17[-1];
+                piVar13 = piVar13 + (int)piVar4 * 2;
+                *piVar17 = (int)local_8;
+                puVar14 = local_8 + (int)piVar4 * 2;
+                local_1c = (int *)0x0;
+                local_c = piVar13;
+                local_8 = puVar14;
+                if (piVar4 != (int *)0x0) {
+                  do {
+                    *(undefined4 **)(*piVar17 + 4 + (int)local_1c * 8) = puVar14;
+                    sVar12 = *(size_t *)(iVar11 + (int)local_1c * 8);
+                    *(size_t *)(*piVar17 + (int)local_1c * 8) = sVar12;
+                    local_8 = puVar14;
+                    memcpy(puVar14,*(void **)(iVar11 + 4 + (int)local_1c * 8),sVar12);
+                    piVar13 = (int *)((int)local_c + sVar12);
+                    puVar14 = (undefined4 *)((int)puVar14 + sVar12);
+                    local_1c = (int *)((int)local_1c + 1);
+                    local_c = piVar13;
+                    local_8 = puVar14;
+                  } while (local_1c < piVar4);
+                }
+              }
+              goto LAB_4;
+            }
+            if (uVar2 == 0x1003) {
+LAB_0:
+              sVar12 = piVar17[-1] << 2;
+LAB_3:
+              memcpy(local_8,(void *)*piVar17,sVar12);
+              *piVar17 = (int)puVar14;
+LAB_5:
+              piVar13 = (int *)((int)local_c + sVar12);
+              local_c = piVar13;
+              local_8 = (undefined4 *)((int)puVar14 + sVar12);
+            }
+            else {
+              if (0x1f < uVar2) {
+                if (uVar2 == 0x40) goto LAB_4;
+                if (uVar2 != 0x48) {
+                  if (uVar2 == 0x102) {
+                    sVar12 = piVar17[-1];
                   }
                   else {
-                    pcVar13 = pcVar5;
-                    do {
-                      cVar1 = *pcVar13;
-                      pcVar13 = pcVar13 + 1;
-                    } while (cVar1 != '\0');
-                    iVar14 = (int)pcVar13 - (int)(pcVar5 + 1);
+                    if (uVar2 != 0x1002) goto LAB_1;
+                    sVar12 = piVar17[-1] * 2;
                   }
-                  local_8 = puVar12;
-                  memcpy(puVar12,pcVar5,iVar14 + 1U);
-                  puVar12 = (undefined4 *)((int)puVar12 + iVar14 + 1U);
-                  local_18 = (int *)((int)local_18 + 1);
-                  local_8 = puVar12;
-                } while (local_18 < uVar4);
+                  goto LAB_3;
+                }
+                puVar3 = (undefined4 *)piVar17[-1];
+                sVar12 = 0x10;
+                *local_8 = *puVar3;
+                local_8[1] = puVar3[1];
+                local_8[2] = puVar3[2];
+                local_8[3] = puVar3[3];
+                piVar17[-1] = (int)local_8;
+                goto LAB_5;
+              }
+              if (uVar2 == 0x1f) {
+                psVar9 = (short *)piVar17[-1];
+                if (psVar9 == (short *)0x0) {
+                  iVar11 = 0;
+                }
+                else {
+                  psVar10 = psVar9;
+                  do {
+                    sVar6 = *psVar10;
+                    psVar10 = psVar10 + 1;
+                  } while (sVar6 != 0);
+                  iVar11 = (int)psVar10 - (int)(psVar9 + 1) >> 1;
+                }
+                sVar12 = iVar11 * 2 + 2;
+LAB_6:
+                memcpy(local_8,psVar9,sVar12);
+                piVar17[-1] = (int)puVar14;
+                goto LAB_5;
+              }
+              if (uVar2 == 0) {
+LAB_1:
+                iVar11 = -0x7ff8ffa9;
+                break;
+              }
+              if (7 < uVar2) {
+                if (9 < uVar2) {
+                  if (((uVar2 < 0xc) || (uVar2 == 0xd)) || (uVar2 == 0x14)) goto LAB_4;
+                  if (uVar2 == 0x1e) {
+                    psVar9 = (short *)piVar17[-1];
+                    if (psVar9 == (short *)0x0) {
+                      iVar11 = 0;
+                    }
+                    else {
+                      psVar10 = psVar9;
+                      do {
+                        sVar6 = *psVar10;
+                        psVar10 = (short *)((int)psVar10 + 1);
+                      } while ((char)sVar6 != '\0');
+                      iVar11 = (int)psVar10 - (int)((int)psVar9 + 1);
+                    }
+                    sVar12 = iVar11 + 1;
+                    goto LAB_6;
+                  }
+                }
+                goto LAB_1;
               }
             }
-            else if (uVar2 == 0x101f) {
-              uVar4 = piVar15[-1];
-              iVar10 = *piVar15;
-              *piVar15 = (int)puVar12;
-              puVar12 = puVar12 + uVar4;
-              local_18 = (int *)0x0;
-              local_8 = puVar12;
-              if (uVar4 != 0) {
-                do {
-                  *(undefined4 **)(*piVar15 + (int)local_18 * 4) = puVar12;
-                  psVar8 = *(short **)(iVar10 + (int)local_18 * 4);
-                  if (psVar8 == (short *)0x0) {
-                    iVar14 = 0;
-                  }
-                  else {
-                    psVar9 = psVar8;
-                    do {
-                      sVar6 = *psVar9;
-                      psVar9 = psVar9 + 1;
-                    } while (sVar6 != 0);
-                    iVar14 = (int)psVar9 - (int)(psVar8 + 1) >> 1;
-                  }
-                  sVar11 = iVar14 * 2 + 2;
-                  local_8 = puVar12;
-                  memcpy(puVar12,psVar8,sVar11);
-                  puVar12 = (undefined4 *)((int)puVar12 + sVar11);
-                  local_18 = (int *)((int)local_18 + 1);
-                  local_8 = puVar12;
-                } while (local_18 < uVar4);
-              }
-            }
-            else {
-              if (uVar2 == 0x1040) goto LAB_2;
-              if (uVar2 == 0x1048) {
-                sVar11 = piVar15[-1] << 4;
-                goto LAB_3;
-              }
-              if (uVar2 != 0x1102) goto LAB_1;
-              uVar4 = piVar15[-1];
-              iVar10 = *piVar15;
-              *piVar15 = (int)puVar12;
-              puVar12 = puVar12 + uVar4 * 2;
-              local_18 = (int *)0x0;
-              local_8 = puVar12;
-              if (uVar4 != 0) {
-                do {
-                  *(undefined4 **)(*piVar15 + 4 + (int)local_18 * 8) = puVar12;
-                  sVar11 = *(size_t *)(iVar10 + (int)local_18 * 8);
-                  *(size_t *)(*piVar15 + (int)local_18 * 8) = sVar11;
-                  local_8 = puVar12;
-                  memcpy(puVar12,*(void **)(iVar10 + 4 + (int)local_18 * 8),sVar11);
-                  puVar12 = (undefined4 *)((int)puVar12 + sVar11);
-                  local_18 = (int *)((int)local_18 + 1);
-                  local_8 = puVar12;
-                } while (local_18 < uVar4);
-              }
-            }
-            goto LAB_4;
-          }
-          if (uVar2 == 0x1003) {
-LAB_0:
-            sVar11 = piVar15[-1] << 2;
-LAB_3:
-            memcpy(puVar12,(void *)*piVar15,sVar11);
-            *piVar15 = (int)puVar12;
-LAB_5:
-            puVar12 = (undefined4 *)((int)puVar12 + sVar11);
-            local_8 = puVar12;
-          }
-          else {
-            if (0x1f < uVar2) {
-              if (uVar2 == 0x40) goto LAB_4;
-              if (uVar2 != 0x48) {
-                if (uVar2 == 0x102) {
-                  sVar11 = piVar15[-1];
-                }
-                else {
-                  if (uVar2 != 0x1002) goto LAB_1;
-                  sVar11 = piVar15[-1] * 2;
-                }
-                goto LAB_3;
-              }
-              puVar3 = (undefined4 *)piVar15[-1];
-              sVar11 = 0x10;
-              *local_8 = *puVar3;
-              local_8[1] = puVar3[1];
-              local_8[2] = puVar3[2];
-              local_8[3] = puVar3[3];
-              piVar15[-1] = (int)local_8;
-              puVar12 = local_8;
-              goto LAB_5;
-            }
-            if (uVar2 == 0x1f) {
-              psVar8 = (short *)piVar15[-1];
-              if (psVar8 == (short *)0x0) {
-                iVar10 = 0;
-              }
-              else {
-                psVar9 = psVar8;
-                do {
-                  sVar6 = *psVar9;
-                  psVar9 = psVar9 + 1;
-                } while (sVar6 != 0);
-                iVar10 = (int)psVar9 - (int)(psVar8 + 1) >> 1;
-              }
-              sVar11 = iVar10 * 2 + 2;
-LAB_6:
-              memcpy(puVar12,psVar8,sVar11);
-              piVar15[-1] = (int)puVar12;
-              goto LAB_5;
-            }
-            if (uVar2 == 0) {
-LAB_1:
-              iVar10 = -0x7ff8ffa9;
-              puVar3 = local_8;
-              break;
-            }
-            if (7 < uVar2) {
-              if (9 < uVar2) {
-                if (((uVar2 < 0xc) || (uVar2 == 0xd)) || (uVar2 == 0x14)) goto LAB_4;
-                if (uVar2 == 0x1e) {
-                  psVar8 = (short *)piVar15[-1];
-                  if (psVar8 == (short *)0x0) {
-                    iVar10 = 0;
-                  }
-                  else {
-                    psVar9 = psVar8;
-                    do {
-                      sVar6 = *psVar9;
-                      psVar9 = (short *)((int)psVar9 + 1);
-                    } while ((char)sVar6 != '\0');
-                    iVar10 = (int)psVar9 - (int)((int)psVar8 + 1);
-                  }
-                  sVar11 = iVar10 + 1;
-                  goto LAB_6;
-                }
-              }
-              goto LAB_1;
-            }
-          }
 LAB_4:
-          piVar15 = piVar15 + 4;
-          iVar10 = local_14;
-          local_18 = piVar15;
-          puVar3 = local_8;
-        } while (puVar7 != (undefined4 *)0x0);
+            piVar17 = piVar17 + 4;
+            iVar11 = local_18;
+            local_1c = piVar17;
+            puVar14 = local_8;
+          } while (puVar8 != (undefined4 *)0x0);
+        }
       }
     }
   }
-  local_8 = puVar3;
-  if (iVar10 == 0) {
-    if (local_c != (void *)0x0) {
-      *(void **)param_4 = local_c;
-      *(undefined4 **)param_3 = local_10;
+  local_8 = puVar14;
+  if (iVar11 == 0) {
+    if (local_10 != (void *)0x0) {
+      *(void **)param_4 = local_10;
+      *(undefined4 **)param_3 = local_14;
     }
   }
-  else if (local_c != (void *)0x0) {
-    FreeBufferAndNull(&local_c);
+  else if (local_10 != (void *)0x0) {
+    FreeBufferAndNull(&local_10);
     *(undefined4 *)param_4 = 0;
   }
-  return iVar10;
+  return iVar11;
 }
 

```


## _ScCountPropsEx@16

### Match Info



|Key|wab32-2022-04.dll - wab32-2022-05.dll|
| :---: | :---: |
|diff_type|code,length,sig,address,called|
|ratio|0.18|
|i_ratio|0.15|
|m_ratio|0.91|
|b_ratio|0.36|
|match_types|SymbolsHash|

### Function Meta Diff



|Key|wab32-2022-04.dll|wab32-2022-05.dll|
| :---: | :---: | :---: |
|name|_ScCountPropsEx@16|_ScCountPropsEx@16|
|fullname|_ScCountPropsEx@16|_ScCountPropsEx@16|
|refcount|6|6|
|`length`|697|861|
|`called`||ULongAdd|
|calling|GetEntryProps<br>PropData::CreateSPV<br>PropData::SetProps<br>ScMergePropValues<br>fnAddress|GetEntryProps<br>PropData::CreateSPV<br>PropData::SetProps<br>ScMergePropValues<br>fnAddress|
|paramcount|4|4|
|`address`|10065d1e|10065d8e|
|`sig`|undefined4 __fastcall _ScCountPropsEx@16(int param_1, uint * param_2, undefined4 param_3, undefined4 * param_4)|undefined4 __fastcall _ScCountPropsEx@16(int param_1, uint * param_2, undefined4 param_3, uint * param_4)|
|sym_type|Function|Function|
|sym_source|IMPORTED|IMPORTED|
|external|False|False|

### _ScCountPropsEx@16 Called Diff


```diff
--- _ScCountPropsEx@16 called
+++ _ScCountPropsEx@16 called
@@ -0,0 +1 @@
+ULongAdd
```


### _ScCountPropsEx@16 Diff


```diff
--- _ScCountPropsEx@16
+++ _ScCountPropsEx@16
@@ -1,214 +1,194 @@
 
-undefined4 __fastcall
-_ScCountPropsEx_16(int param_1,uint *param_2,undefined4 param_3,undefined4 *param_4)
+undefined4 __fastcall _ScCountPropsEx_16(int param_1,uint *param_2,undefined4 param_3,uint *param_4)
 
 {
-  char *pcVar1;
-  short *psVar2;
-  char cVar3;
-  short sVar4;
+  char cVar1;
+  short sVar2;
+  undefined4 uVar3;
+  long lVar4;
   uint uVar5;
-  int iVar6;
-  uint uVar7;
-  uint uVar8;
+  uint uVar6;
+  char *pcVar7;
+  int iVar8;
   short *psVar9;
-  char *pcVar10;
-  char *pcVar11;
+  ulong *unaff_ESI;
+  ulong unaff_EDI;
+  uint local_8;
   
-  pcVar10 = (char *)0x0;
-  if (param_1 != 0) {
-    if (param_2 == (uint *)0x0) {
-      return 0x80070057;
+  local_8 = 0;
+  if (param_1 == 0) {
+LAB_0:
+    if (param_4 != (uint *)0x0) {
+      *param_4 = local_8;
     }
-    while (uVar7 = 0, param_1 != 0) {
+    uVar3 = 0;
+  }
+  else {
+    if (param_2 != (uint *)0x0) {
+LAB_1:
+      if (param_1 == 0) goto LAB_0;
       param_1 = param_1 + -1;
-      uVar8 = *param_2 >> 0x10;
+      uVar6 = *param_2 >> 0x10;
       uVar5 = *param_2 & 0xffff;
-      if (uVar8 == 0xffff) {
-        return 0x80070057;
+      if (((uVar6 == 0xffff) || ((uVar5 == 1 && (uVar6 != 0)))) ||
+         ((uVar6 == 0 && ((uVar5 != 1 && (uVar5 != 10)))))) goto LAB_2;
+      uVar6 = local_8 + 0x10;
+      if (uVar6 < local_8) {
+        return 0x80040305;
       }
-      if ((uVar5 == 1) && (uVar8 != 0)) {
-        return 0x80070057;
-      }
-      if (((uVar8 == 0) && (uVar5 != 1)) && (uVar5 != 10)) {
-        return 0x80070057;
-      }
-      pcVar11 = pcVar10 + 0x10;
+      local_8 = uVar6;
       if (uVar5 < 0x1004) {
         if (uVar5 == 0x1003) {
-LAB_0:
-          iVar6 = param_2[2] << 2;
-LAB_1:
-          if (iVar6 == 0) {
-            return 0x80070057;
+LAB_3:
+          iVar8 = param_2[2] << 2;
+          goto LAB_4;
+        }
+        if (uVar5 < 0x20) {
+          if (uVar5 != 0x1f) {
+            if (uVar5 == 0) goto LAB_2;
+            if (uVar5 < 8) goto LAB_5;
+            if (uVar5 < 10) goto LAB_2;
+            if (((0xb < uVar5) && (uVar5 != 0xd)) && (uVar5 != 0x14)) {
+              if ((uVar5 == 0x1e) && (pcVar7 = (char *)param_2[2], pcVar7 != (char *)0x0)) {
+                do {
+                  cVar1 = *pcVar7;
+                  pcVar7 = pcVar7 + 1;
+                } while (cVar1 != '\0');
+                goto LAB_6;
+              }
+              goto LAB_2;
+            }
+            goto LAB_5;
           }
-          if (param_2[3] == 0) {
-            return 0x80070057;
+          psVar9 = (short *)param_2[2];
+          if (psVar9 == (short *)0x0) goto LAB_2;
+          do {
+            sVar2 = *psVar9;
+            psVar9 = psVar9 + 1;
+          } while (sVar2 != 0);
+        }
+        else {
+          if (uVar5 == 0x40) goto LAB_5;
+          if (uVar5 != 0x48) {
+            if (uVar5 == 0x102) {
+              if (param_2[2] == 0) goto LAB_6;
+              goto LAB_7;
+            }
+            if (uVar5 == 0x1002) {
+              iVar8 = param_2[2] * 2;
+              goto LAB_4;
+            }
+            goto LAB_2;
           }
-          pcVar11 = pcVar11 + iVar6;
+          uVar5 = param_2[2];
+joined_r0x10065ee1:
+          if (uVar5 == 0) goto LAB_2;
         }
-        else if (uVar5 < 0x20) {
-          if (uVar5 == 0x1f) {
-            psVar9 = (short *)param_2[2];
-            if (psVar9 == (short *)0x0) {
-              return 0x80070057;
-            }
-            psVar2 = psVar9 + 1;
-            do {
-              sVar4 = *psVar9;
-              psVar9 = psVar9 + 1;
-            } while (sVar4 != 0);
-            pcVar11 = pcVar11 + ((int)psVar9 - (int)psVar2 >> 1) * 2 + 2;
-          }
-          else {
-            if (uVar5 == 0) {
-              return 0x80070057;
-            }
-            if (7 < uVar5) {
-              if (uVar5 < 10) {
-                return 0x80070057;
-              }
-              if (((0xb < uVar5) && (uVar5 != 0xd)) && (uVar5 != 0x14)) {
-                if (uVar5 != 0x1e) {
-                  return 0x80070057;
-                }
-                pcVar11 = (char *)param_2[2];
-                if (pcVar11 == (char *)0x0) {
-                  return 0x80070057;
-                }
-                pcVar1 = pcVar11 + 1;
-                do {
-                  cVar3 = *pcVar11;
-                  pcVar11 = pcVar11 + 1;
-                } while (cVar3 != '\0');
-                pcVar11 = pcVar11 + (int)(pcVar10 + (0x11 - (int)pcVar1));
-              }
-            }
-          }
-        }
-        else if (uVar5 != 0x40) {
-          if (uVar5 == 0x48) {
-            if (param_2[2] == 0) {
-              return 0x80070057;
-            }
-            pcVar11 = pcVar10 + 0x20;
-          }
-          else {
-            if (uVar5 != 0x102) {
-              if (uVar5 != 0x1002) {
-                return 0x80070057;
-              }
-              iVar6 = param_2[2] * 2;
-              goto LAB_1;
-            }
-            if ((param_2[2] != 0) && (param_2[3] == 0)) {
-              return 0x80070057;
-            }
-            pcVar11 = pcVar11 + param_2[2];
-          }
+LAB_6:
+        lVar4 = ULongAdd((ulong)&local_8,unaff_EDI,unaff_ESI);
+        if (lVar4 < 0) {
+          return 0x80040305;
         }
       }
       else if (uVar5 < 0x101f) {
         if (uVar5 != 0x101e) {
-          if (uVar5 == 0x1004) goto LAB_0;
-          if (((uVar5 != 0x1005) && (uVar5 != 0x1006)) && ((uVar5 != 0x1007 && (uVar5 != 0x1014))))
-          {
-            return 0x80070057;
-          }
-LAB_2:
-          iVar6 = param_2[2] << 3;
-          goto LAB_1;
+          if (uVar5 == 0x1004) goto LAB_3;
+          if ((((uVar5 == 0x1005) || (uVar5 == 0x1006)) || (uVar5 == 0x1007)) || (uVar5 == 0x1014))
+          goto LAB_8;
+          goto LAB_2;
         }
-        uVar7 = param_2[2];
-        if (uVar7 * 4 == 0) {
-          return 0x80070057;
+        uVar5 = param_2[2];
+        if (((uVar5 & 0x3fffffff) == 0) || (param_2[3] == 0)) goto LAB_2;
+        lVar4 = ULongAdd((ulong)&local_8,unaff_EDI,unaff_ESI);
+        if (lVar4 < 0) {
+          return 0x80040305;
         }
-        uVar5 = param_2[3];
-        if (uVar5 == 0) {
-          return 0x80070057;
-        }
-        pcVar11 = pcVar11 + uVar7 * 4;
-        uVar8 = 0;
-        if (uVar7 != 0) {
+        uVar6 = 0;
+        if (uVar5 != 0) {
           do {
-            pcVar10 = *(char **)(uVar5 + uVar8 * 4);
-            if (pcVar10 == (char *)0x0) {
-              return 0x80070057;
+            pcVar7 = *(char **)(param_2[3] + uVar6 * 4);
+            if (pcVar7 == (char *)0x0) goto LAB_2;
+            do {
+              cVar1 = *pcVar7;
+              pcVar7 = pcVar7 + 1;
+            } while (cVar1 != '\0');
+            lVar4 = ULongAdd((ulong)&local_8,unaff_EDI,unaff_ESI);
+            if (lVar4 < 0) {
+              return 0x80040305;
             }
-            pcVar1 = pcVar10 + 1;
-            do {
-              cVar3 = *pcVar10;
-              pcVar10 = pcVar10 + 1;
-            } while (cVar3 != '\0');
-            pcVar11 = pcVar10 + (int)(pcVar11 + (1 - (int)pcVar1));
-            uVar5 = param_2[3];
-            uVar8 = uVar8 + 1;
-          } while (uVar8 < uVar7);
-        }
-      }
-      else if (uVar5 == 0x101f) {
-        uVar7 = param_2[2];
-        if (uVar7 * 4 == 0) {
-          return 0x80070057;
-        }
-        uVar5 = param_2[3];
-        if (uVar5 == 0) {
-          return 0x80070057;
-        }
-        pcVar11 = pcVar11 + uVar7 * 4;
-        uVar8 = 0;
-        if (uVar7 != 0) {
-          do {
-            psVar9 = *(short **)(uVar5 + uVar8 * 4);
-            if (psVar9 == (short *)0x0) {
-              return 0x80070057;
-            }
-            psVar2 = psVar9 + 1;
-            do {
-              sVar4 = *psVar9;
-              psVar9 = psVar9 + 1;
-            } while (sVar4 != 0);
-            uVar5 = param_2[3];
-            pcVar11 = pcVar11 + ((int)psVar9 - (int)psVar2 >> 1) * 2 + 2;
-            uVar8 = uVar8 + 1;
-          } while (uVar8 < uVar7);
+            uVar6 = uVar6 + 1;
+          } while (uVar6 < uVar5);
         }
       }
       else {
-        if (uVar5 == 0x1040) goto LAB_2;
-        if (uVar5 == 0x1048) {
-          iVar6 = param_2[2] << 4;
-          goto LAB_1;
-        }
-        if (uVar5 != 0x1102) {
-          return 0x80070057;
+        if (uVar5 != 0x101f) {
+          if (uVar5 == 0x1040) {
+LAB_8:
+            iVar8 = param_2[2] << 3;
+          }
+          else {
+            if (uVar5 != 0x1048) {
+              if (((uVar5 == 0x1102) && (uVar5 = param_2[2], (uVar5 & 0x1fffffff) != 0)) &&
+                 (param_2[3] != 0)) {
+                lVar4 = ULongAdd((ulong)&local_8,unaff_EDI,unaff_ESI);
+                if (lVar4 < 0) {
+                  return 0x80040305;
+                }
+                uVar6 = 0;
+                if (uVar5 != 0) {
+                  do {
+                    if (*(int *)(param_2[3] + 4 + uVar6 * 8) == 0) goto LAB_2;
+                    lVar4 = ULongAdd((ulong)&local_8,unaff_EDI,unaff_ESI);
+                    if (lVar4 < 0) {
+                      return 0x80040305;
+                    }
+                    uVar6 = uVar6 + 1;
+                  } while (uVar6 < uVar5);
+                }
+                goto LAB_5;
+              }
+              goto LAB_2;
+            }
+            iVar8 = param_2[2] << 4;
+          }
+LAB_4:
+          if (iVar8 != 0) {
+LAB_7:
+            uVar5 = param_2[3];
+            goto joined_r0x10065ee1;
+          }
+          goto LAB_2;
         }
         uVar5 = param_2[2];
-        if (uVar5 * 8 == 0) {
-          return 0x80070057;
+        if (((uVar5 & 0x3fffffff) == 0) || (param_2[3] == 0)) goto LAB_2;
+        lVar4 = ULongAdd((ulong)&local_8,unaff_EDI,unaff_ESI);
+        if (lVar4 < 0) {
+          return 0x80040305;
         }
-        uVar8 = param_2[3];
-        if (uVar8 == 0) {
-          return 0x80070057;
-        }
-        pcVar11 = pcVar11 + uVar5 * 8;
+        uVar6 = 0;
         if (uVar5 != 0) {
           do {
-            if (*(int *)(uVar8 + 4 + uVar7 * 8) == 0) {
-              return 0x80070057;
+            psVar9 = *(short **)(param_2[3] + uVar6 * 4);
+            if (psVar9 == (short *)0x0) goto LAB_2;
+            do {
+              sVar2 = *psVar9;
+              psVar9 = psVar9 + 1;
+            } while (sVar2 != 0);
+            lVar4 = ULongAdd((ulong)&local_8,unaff_EDI,unaff_ESI);
+            if (lVar4 < 0) {
+              return 0x80040305;
             }
-            pcVar11 = pcVar11 + *(int *)(uVar8 + uVar7 * 8);
-            uVar7 = uVar7 + 1;
-          } while (uVar7 < uVar5);
+            uVar6 = uVar6 + 1;
+          } while (uVar6 < uVar5);
         }
       }
+LAB_5:
       param_2 = param_2 + 4;
-      pcVar10 = pcVar11;
+      goto LAB_1;
     }
+LAB_2:
+    uVar3 = 0x80070057;
   }
-  if (param_4 != (undefined4 *)0x0) {
-    *param_4 = pcVar10;
-  }
-  return 0;
+  return uVar3;
 }
 

```


# Modified (No Code Changes)


*Slightly modified functions have no code changes, rather differnces in:*
- refcount
- length
- called
- calling
- name
- fullname

## ULongAdd

### Match Info



|Key|wab32-2022-04.dll - wab32-2022-05.dll|
| :---: | :---: |
|diff_type|refcount,calling|
|ratio|1.0|
|i_ratio|1.0|
|m_ratio|1.0|
|b_ratio|1.0|
|match_types|SymbolsHash|

### Function Meta Diff



|Key|wab32-2022-04.dll|wab32-2022-05.dll|
| :---: | :---: | :---: |
|name|ULongAdd|ULongAdd|
|fullname|ULongAdd|ULongAdd|
|`refcount`|19|27|
|length|37|37|
|called|||
|`calling`|<details><summary>Expand for full list:<br>ABView::DupRgbEx<br>CreateWABEntryIDEx<br>FillTableDataFromPropertyStore<br>HrBuildCertSBinaryData<br>HrCbNewSPropTagArray<br>HrDoDetailedWABIntegrityCheck<br>SecurityCheckBufferRequest<br>SizeOfMultiPropData<br>TableData::ReplaceRows<br>_PropCopyMore@16<br>bIsValidRecord</summary></details>|<details><summary>Expand for full list:<br>ABView::DupRgbEx<br>CreateWABEntryIDEx<br>FillTableDataFromPropertyStore<br>HrBuildCertSBinaryData<br>HrCbNewSPropTagArray<br>HrDoDetailedWABIntegrityCheck<br>ScMergePropValues<br>SecurityCheckBufferRequest<br>SizeOfMultiPropData<br>TableData::ReplaceRows<br>_PropCopyMore@16</summary>_ScCountPropsEx@16<br>bIsValidRecord</details>|
|paramcount|3|3|
|address|1000de24|1000de24|
|sig|long __stdcall ULongAdd(ulong param_1, ulong param_2, ulong * param_3)|long __stdcall ULongAdd(ulong param_1, ulong param_2, ulong * param_3)|
|sym_type|Function|Function|
|sym_source|ANALYSIS|ANALYSIS|
|external|False|False|

### ULongAdd Calling Diff


```diff
--- ULongAdd calling
+++ ULongAdd calling
@@ -6,0 +7 @@
+ScMergePropValues
@@ -10,0 +12 @@
+_ScCountPropsEx@16
```


## QueryInterface

### Match Info



|Key|wab32-2022-04.dll - wab32-2022-05.dll|
| :---: | :---: |
|diff_type|refcount,address|
|ratio|1.0|
|i_ratio|0.92|
|m_ratio|1.0|
|b_ratio|1.0|
|match_types|SymbolsHash|

### Function Meta Diff



|Key|wab32-2022-04.dll|wab32-2022-05.dll|
| :---: | :---: | :---: |
|name|QueryInterface|QueryInterface|
|fullname|CContactPropertyCollection::QueryInterface|CContactPropertyCollection::QueryInterface|
|`refcount`|4|3|
|length|40|40|
|called|SHLWAPI.DLL::Ordinal_219|SHLWAPI.DLL::Ordinal_219|
|calling|CContactPropertyCollection::CreateInstance|CContactPropertyCollection::CreateInstance|
|paramcount|2|2|
|`address`|10081730|10081850|
|sig|long __stdcall QueryInterface(_GUID * param_1, void * * param_2)|long __stdcall QueryInterface(_GUID * param_1, void * * param_2)|
|sym_type|Function|Function|
|sym_source|ANALYSIS|ANALYSIS|
|external|False|False|



<sub>Generated with `ghidriff` version: 1.0.0 on 2026-08-15T21:27:07</sub>