Skip to content

Commit

Permalink
Fixes #587 - Scrape string constants
Browse files Browse the repository at this point in the history
  • Loading branch information
sotteson1 committed Jan 15, 2022
1 parent f2c101e commit fde4cfc
Show file tree
Hide file tree
Showing 7 changed files with 77 additions and 25 deletions.
35 changes: 18 additions & 17 deletions generation/WinSDK/ConstantsScraper.header.txt
Original file line number Diff line number Diff line change
@@ -1,30 +1,31 @@
using Windows.Win32.UI.Shell.PropertiesSystem; // For PROPERTYKEY
using Windows.Win32.System.SystemServices;
using static Windows.Win32.Data.Xml.MsXml.Apis; // Various constants
using static Windows.Win32.Devices.DeviceAccess.Apis; // Various constants
using static Windows.Win32.Foundation.Apis; // Various constants
using static Windows.Win32.Foundation.WIN32_ERROR;
using static Windows.Win32.System.SystemServices.Apis; // Various constants
using static Windows.Win32.Graphics.Direct3D9.D3DFORMAT; // For D3DFMT_* constants
using static Windows.Win32.Media.Apis; // Various constants
using static Windows.Win32.Media.Audio.Apis; // Various constants
using static Windows.Win32.Media.DirectShow.Apis; // Various constants
using static Windows.Win32.Media.KernelStreaming.Apis; // Various constants
using static Windows.Win32.Media.Multimedia.Apis; // Various constants
using static Windows.Win32.UI.WindowsAndMessaging.Apis; // For WM_USER
using static Windows.Win32.Storage.FileSystem.FILE_ACCESS_FLAGS; // For FILE_* constants
using static Windows.Win32.System.Diagnostics.Debug.FACILITY_CODE; // For MAKE_HRESULT constants
using static Windows.Win32.Graphics.Direct3D9.D3DFORMAT; // For D3DFMT_* constants
using static Windows.Win32.UI.Controls.Apis; // Various constants
using static Windows.Win32.System.Com.Apis; // Various constants
using static Windows.Win32.System.Ole.Apis; // Various constants
using static Windows.Win32.System.SystemInformation.Apis; // Various constants
using static Windows.Win32.NetworkManagement.Ndis.Apis; // Various constants
using static Windows.Win32.Devices.DeviceAccess.Apis; // Various constants
using static Windows.Win32.Networking.Clustering.Apis; // Various constants
using static Windows.Win32.Networking.WinHttp.Apis; // Various constants
using static Windows.Win32.System.Registry.Apis; // Various constants
using static Windows.Win32.Data.Xml.MsXml.Apis; // Various constants
using static Windows.Win32.System.Kernel.Apis; // Various constants
using static Windows.Win32.System.Threading.Apis; // Various constants
using static Windows.Win32.Networking.WinInet.Apis; // Various constants
using static Windows.Win32.NetworkManagement.Dns.Apis; // Various constants
using static Windows.Win32.NetworkManagement.IpHelper.Apis; // Various constants
using static Windows.Win32.Networking.Clustering.Apis; // Various constants
using static Windows.Win32.NetworkManagement.Ndis.Apis; // Various constants
using static Windows.Win32.Security.Cryptography.Apis; // Various constants
using static Windows.Win32.Storage.FileSystem.FILE_ACCESS_FLAGS; // For FILE_* constants
using static Windows.Win32.System.Com.Apis; // Various constants
using static Windows.Win32.System.Diagnostics.Debug.FACILITY_CODE; // For MAKE_HRESULT constants
using static Windows.Win32.System.Ioctl.Apis; // Various constants

using static Windows.Win32.System.Kernel.Apis; // Various constants
using static Windows.Win32.System.Registry.Apis; // Various constants
using static Windows.Win32.System.SystemInformation.Apis; // Various constants
using static Windows.Win32.System.SystemServices.Apis; // Various constants
using static Windows.Win32.System.Threading.Apis; // Various constants
using static Windows.Win32.System.Ole.Apis; // Various constants
using static Windows.Win32.UI.WindowsAndMessaging.Apis; // For WM_USER
using static Windows.Win32.UI.Controls.Apis; // Various constants
10 changes: 10 additions & 0 deletions generation/WinSDK/ConstantsScraper.settings.rsp
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ WRITE_OWNER=uint
--exclude
TRUE
FALSE
true
false
NULL
POWER_PLATFORM_ROLE_V1_MAX
POWER_PLATFORM_ROLE_V2_MAX
Expand Down Expand Up @@ -130,3 +132,11 @@ INTERNET_SCHEME_HTTP
INTERNET_SCHEME_HTTPS
INTERNET_SCHEME_FTP
INTERNET_SCHEME_SOCKS
U_ICUDATA_NAME
PRINTSCHEMA_KEYWORDS_NAMESPACE_URI
PRINTSCHEMA_KEYWORDSV11_NAMESPACE_URI
ISCSI_SECURITY_FLAGS_CPPQUOTE
ISCSI_DIGEST_CPPQUOTE
ISCSI_LOGIN_FLAGS_CPPQUOTE
ISCSI_LOGIN_OPTIONS_INFO_CPPQUOTE
IKE_AUTHENTICATION_PAYLOAD_TYPE_CPPQUOTE
1 change: 1 addition & 0 deletions generation/WinSDK/scraper.settings.rsp
Original file line number Diff line number Diff line change
Expand Up @@ -11942,3 +11942,4 @@ _TREEITEM*=HTREEITEM
_IMAGELIST*=HIMAGELIST
_DSA*=HDSA
_DPA*=HDPA
__NCRYPT_PCP_TPM_WEB_AUTHN_ATTESTATION_STATEMENT=NCRYPT_PCP_TPM_WEB_AUTHN_ATTESTATION_STATEMENT
4 changes: 2 additions & 2 deletions scripts/BaselineWinmd/Windows.Win32.winmd
Git LFS file not shown
2 changes: 1 addition & 1 deletion sources/MetadataUtils/ConstantWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ public void AddInt(string forceType, string nativeTypeName, string name, string
}

string type = null;
if (nativeTypeName == "HRESULT" || nativeTypeName == "LPCWSTR" || nativeTypeName == "HWND")
if (nativeTypeName == "HRESULT" || nativeTypeName == "LPCWSTR" || nativeTypeName == "LPCSTR" || nativeTypeName == "HWND")
{
type = "int";
}
Expand Down
33 changes: 30 additions & 3 deletions sources/MetadataUtils/ConstantsScraper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ private class ConstantsScraperImpl : IDisposable
{
private static readonly Regex DefineRegex =
new Regex(
@"^\s*#\s*define\s+([_A-Z][\dA-Za-z_]+)\s+(.+)");
@"^\s*#\s*define\s+([_A-Za-z][\dA-Za-z_]+)\s+(.+)");

private static readonly Regex DefineConstantRegex =
new Regex(
Expand Down Expand Up @@ -67,6 +67,10 @@ private class ConstantsScraperImpl : IDisposable
new Regex(
@"^\s*(?:MAKE_HRESULT|MAKE_SCODE)\((.+)\)");

private static readonly Regex IntCastToLpcstrRegex =
new Regex(
@"^\s*\((LPCSTR|LPCWSTR)\)\s*(\d+)");

private static readonly Regex NamePartsRegex = new Regex(@"[A-Z]+[a-z]*");

private static readonly Regex ContainsLowerCase = new Regex(@"[a-z]+");
Expand Down Expand Up @@ -587,6 +591,15 @@ private void ScrapeConstantsFromTraversedFiles(Dictionary<string, string> traver
}
}

Match intCastToLpcstrMatch = IntCastToLpcstrRegex.Match(fixedRawValue);
if (intCastToLpcstrMatch.Success)
{
var nativeStrType = intCastToLpcstrMatch.Groups[1].Value;
var value = intCastToLpcstrMatch.Groups[2].Value;
this.AddConstantInteger(currentNamespace, nativeStrType, name, value);
continue;
}

// See if matches one of our well known constants formats
Match match = DefineConstantRegex.Match(fixedRawValue);
string valueText;
Expand Down Expand Up @@ -700,9 +713,23 @@ private void ScrapeConstantsFromTraversedFiles(Dictionary<string, string> traver
{
valueText = rawValue;

// Don't do anything with strings. They can't be part of enums
if (valueText.StartsWith('"') || valueText.StartsWith("L\"") || valueText.StartsWith("__TEXT"))
if (valueText.StartsWith("__TEXT("))
{
valueText = valueText.Substring("__TEXT(".Length);
if (valueText.EndsWith(')'))
{
valueText = valueText.Substring(0, valueText.Length - 1);
}
}
else if (valueText.StartsWith("L\""))
{
valueText = valueText.Substring(1);
}

// Strings can't be part of enums so go ahead and add the constant directly
if (valueText.StartsWith('"'))
{
this.AddConstantValue(currentNamespace, "string", name, valueText);
continue;
}

Expand Down
17 changes: 15 additions & 2 deletions sources/WinmdUtils/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1029,9 +1029,22 @@ public static bool CompareFields(IField field1, IField field2, IConsole console)
var fieldVal1 = field1.GetConstantValue();
var fieldVal2 = field2.GetConstantValue();

if (fieldVal1.ToString() != fieldVal2.ToString())
if (fieldVal1 == null)
{
console?.Out.Write($"winmd1: {field1.Name} = {fieldVal1}, winmd2 = {fieldVal2}\r\n");
console?.Out.Write($"winmd1: {field1.Name} is a constant with a null value\r\n");
}

if (fieldVal2 == null)
{
console?.Out.Write($"winmd2: {field2.Name} is a constant with a null value\r\n");
}

string val1 = fieldVal1?.ToString();
string val2 = fieldVal2?.ToString();

if (val1 != val2)
{
console?.Out.Write($"winmd1: {field1.Name} = {val1}, winmd2 = {val2}\r\n");
ret = false;
}
}
Expand Down

0 comments on commit fde4cfc

Please sign in to comment.