[PATCH 4/5] kernel32: Implement PackageFullNameFromId().

Paul Gofman pgofman at codeweavers.com
Fri Mar 26 04:37:46 CDT 2021


Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
---
 .../api-ms-win-appmodel-runtime-l1-1-1.spec   |  2 +-
 .../ext-ms-win-kernel32-package-l1-1-1.spec   |  2 +-
 dlls/kernel32/kernel32.spec                   |  1 +
 dlls/kernel32/tests/version.c                 | 22 +++++++++-
 dlls/kernelbase/kernelbase.spec               |  2 +-
 dlls/kernelbase/version.c                     | 43 +++++++++++++++++++
 include/appmodel.h                            |  1 +
 7 files changed, 69 insertions(+), 4 deletions(-)

diff --git a/dlls/api-ms-win-appmodel-runtime-l1-1-1/api-ms-win-appmodel-runtime-l1-1-1.spec b/dlls/api-ms-win-appmodel-runtime-l1-1-1/api-ms-win-appmodel-runtime-l1-1-1.spec
index 696bb75be30..72a0a33baf5 100644
--- a/dlls/api-ms-win-appmodel-runtime-l1-1-1/api-ms-win-appmodel-runtime-l1-1-1.spec
+++ b/dlls/api-ms-win-appmodel-runtime-l1-1-1/api-ms-win-appmodel-runtime-l1-1-1.spec
@@ -21,7 +21,7 @@
 @ stub OpenPackageInfoByFullName
 @ stub PackageFamilyNameFromFullName
 @ stub PackageFamilyNameFromId
-@ stub PackageFullNameFromId
+@ stdcall PackageFullNameFromId(ptr ptr ptr) kernel32.PackageFullNameFromId
 @ stdcall PackageIdFromFullName(wstr long ptr ptr) kernel32.PackageIdFromFullName
 @ stub PackageNameAndPublisherIdFromFamilyName
 @ stub ParseApplicationUserModelId
diff --git a/dlls/ext-ms-win-kernel32-package-l1-1-1/ext-ms-win-kernel32-package-l1-1-1.spec b/dlls/ext-ms-win-kernel32-package-l1-1-1/ext-ms-win-kernel32-package-l1-1-1.spec
index ff5118049e2..42566176b56 100644
--- a/dlls/ext-ms-win-kernel32-package-l1-1-1/ext-ms-win-kernel32-package-l1-1-1.spec
+++ b/dlls/ext-ms-win-kernel32-package-l1-1-1/ext-ms-win-kernel32-package-l1-1-1.spec
@@ -17,5 +17,5 @@
 @ stub OpenPackageInfoByFullName
 @ stub PackageFamilyNameFromFullName
 @ stub PackageFamilyNameFromId
-@ stub PackageFullNameFromId
+@ stdcall PackageFullNameFromId(ptr ptr ptr) kernel32.PackageFullNameFromId
 @ stdcall PackageIdFromFullName(wstr long ptr ptr) kernel32.PackageIdFromFullName
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index d605ed6e771..4cfcf6df188 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -1153,6 +1153,7 @@
 @ stdcall -import PeekConsoleInputW(ptr ptr long ptr)
 @ stdcall -import PeekNamedPipe(long ptr long ptr ptr ptr)
 @ stdcall -import PostQueuedCompletionStatus(long long ptr ptr)
+@ stdcall -import PackageFullNameFromId(ptr ptr ptr)
 @ stdcall -import PackageIdFromFullName(wstr long ptr ptr)
 @ stdcall PowerClearRequest(long long)
 @ stdcall PowerCreateRequest(ptr)
diff --git a/dlls/kernel32/tests/version.c b/dlls/kernel32/tests/version.c
index 9a35d679323..ed1ef3e3bf7 100644
--- a/dlls/kernel32/tests/version.c
+++ b/dlls/kernel32/tests/version.c
@@ -26,6 +26,7 @@
 static LONG (WINAPI * pGetPackagesByPackageFamily)(const WCHAR *, UINT32 *, WCHAR **, UINT32 *, WCHAR *);
 static BOOL (WINAPI * pGetProductInfo)(DWORD, DWORD, DWORD, DWORD, DWORD *);
 static UINT (WINAPI * pGetSystemFirmwareTable)(DWORD, DWORD, void *, DWORD);
+static LONG (WINAPI * pPackageFullNameFromId)(const PACKAGE_ID *, UINT32 *, WCHAR *);
 static LONG (WINAPI * pPackageIdFromFullName)(const WCHAR *, UINT32, UINT32 *, BYTE *);
 static NTSTATUS (WINAPI * pNtQuerySystemInformation)(SYSTEM_INFORMATION_CLASS, void *, ULONG, ULONG *);
 static NTSTATUS (WINAPI * pRtlGetVersion)(RTL_OSVERSIONINFOEXW *);
@@ -47,6 +48,7 @@ static void init_function_pointers(void)
     GET_PROC(GetPackagesByPackageFamily);
     GET_PROC(GetProductInfo);
     GET_PROC(GetSystemFirmwareTable);
+    GET_PROC(PackageFullNameFromId);
     GET_PROC(PackageIdFromFullName);
 
     hmod = GetModuleHandleA("ntdll.dll");
@@ -803,9 +805,11 @@ static void test_PackageIdFromFullName(void)
     {
         0, PROCESSOR_ARCHITECTURE_INTEL,
                 {{.Major = 1, .Minor = 2, .Build = 3, .Revision = 4}},
-                (WCHAR *)L"TestPackage", NULL,
+                (WCHAR *)L"TestPackage", (WCHAR *)L"TestResource",
                 (WCHAR *)L"TestResourceId", (WCHAR *)L"0abcdefghjkme"
     };
+    static const WCHAR test_package_fullname[] =
+            L"TestPackage_1.2.3.4_x86_TestResourceId_0abcdefghjkme";
     UINT32 size, expected_size;
     PACKAGE_ID test_id;
     WCHAR fullname[512];
@@ -918,6 +922,22 @@ static void test_PackageIdFromFullName(void)
     size = sizeof(id_buffer);
     ret = pPackageIdFromFullName(L"TestPackage_1.2.3.4_X86_0abcdefghjkme", 0, &size, id_buffer);
     ok(ret == ERROR_INVALID_PARAMETER, "Got unexpected ret %u.\n", ret);
+
+    ret = pPackageFullNameFromId(&test_package_id, NULL, NULL);
+    ok(ret == ERROR_INVALID_PARAMETER, "Got unexpected ret %u.\n", ret);
+
+    size = sizeof(fullname);
+    ret = pPackageFullNameFromId(&test_package_id, &size, NULL);
+    ok(ret == ERROR_INVALID_PARAMETER, "Got unexpected ret %u.\n", ret);
+
+    size = 0;
+    ret = pPackageFullNameFromId(&test_package_id, &size, NULL);
+    ok(ret == ERROR_INSUFFICIENT_BUFFER, "Got unexpected ret %u.\n", ret);
+    ok(size == lstrlenW(test_package_fullname) + 1, "Got unexpected size %u.\n", size);
+
+    ret = pPackageFullNameFromId(&test_package_id, &size, fullname);
+    ok(ret == ERROR_SUCCESS, "Got unexpected ret %u.\n", ret);
+    ok(!lstrcmpW(fullname, test_package_fullname), "Got unexpected fullname %s.\n", debugstr_w(fullname));
 }
 
 static void test_package_info(void)
diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec
index b385ebd6774..fc7671781f1 100644
--- a/dlls/kernelbase/kernelbase.spec
+++ b/dlls/kernelbase/kernelbase.spec
@@ -1012,7 +1012,7 @@
 # @ stub PackageFamilyNameFromFullName
 # @ stub PackageFamilyNameFromId
 # @ stub PackageFamilyNameFromProductId
-# @ stub PackageFullNameFromId
+@ stdcall PackageFullNameFromId(ptr ptr ptr)
 # @ stub PackageFullNameFromProductId
 @ stdcall PackageIdFromFullName(wstr long ptr ptr)
 # @ stub PackageIdFromProductId
diff --git a/dlls/kernelbase/version.c b/dlls/kernelbase/version.c
index 1efd4adaee7..b2a6ceb182e 100644
--- a/dlls/kernelbase/version.c
+++ b/dlls/kernelbase/version.c
@@ -1597,6 +1597,16 @@ UINT32 processor_arch_from_string(const WCHAR *str, unsigned int len)
     return ~0u;
 }
 
+const WCHAR *string_from_processor_arch(UINT32 code)
+{
+    unsigned int i;
+
+    for (i = 0; i < ARRAY_SIZE(arch_names); ++i)
+        if (code == arch_names[i].code)
+            return arch_names[i].name;
+    return NULL;
+}
+
 /***********************************************************************
  *         PackageIdFromFullName   (kernelbase.@)
  */
@@ -1687,6 +1697,39 @@ LONG WINAPI PackageIdFromFullName(const WCHAR *full_name, UINT32 flags, UINT32 *
 }
 
 
+/***********************************************************************
+ *         PackageFullNameFromId   (kernelbase.@)
+ */
+LONG WINAPI PackageFullNameFromId(const PACKAGE_ID *package_id, UINT32 *length, WCHAR *full_name)
+{
+    WCHAR ver_str[5 * 4 + 3 + 1];
+    const WCHAR *arch_str;
+    UINT32 have_length;
+
+    TRACE("package_id %p, length %p, full_name %p.\n", package_id, length, full_name);
+
+    if (!package_id || !length)
+        return ERROR_INVALID_PARAMETER;
+    if (!full_name && *length)
+        return ERROR_INVALID_PARAMETER;
+    if (!package_id->name || !package_id->resourceId || !package_id->publisherId
+            || !(arch_str = string_from_processor_arch(package_id->processorArchitecture)))
+        return ERROR_INVALID_PARAMETER;
+
+    swprintf(ver_str, ARRAY_SIZE(ver_str), L"%u.%u.%u.%u", package_id->version.u.s.Major,
+            package_id->version.u.s.Minor, package_id->version.u.s.Build, package_id->version.u.s.Revision);
+    have_length = *length;
+    *length = lstrlenW(package_id->name) + 1 + lstrlenW(ver_str) + 1 + lstrlenW(arch_str) + 1
+            + lstrlenW(package_id->resourceId) + 1 + lstrlenW(package_id->publisherId) + 1;
+
+    if (have_length < *length)
+        return ERROR_INSUFFICIENT_BUFFER;
+
+    swprintf(full_name, *length, L"%s_%s_%s_%s_%s", package_id->name, ver_str, arch_str, package_id->resourceId, package_id->publisherId);
+    return ERROR_SUCCESS;
+}
+
+
 /***********************************************************************
  *         GetPackagesByPackageFamily   (kernelbase.@)
  */
diff --git a/include/appmodel.h b/include/appmodel.h
index 27a0d0a8646..be59bc70f5f 100644
--- a/include/appmodel.h
+++ b/include/appmodel.h
@@ -84,6 +84,7 @@ LONG WINAPI AppPolicyGetThreadInitializationType(HANDLE token, AppPolicyThreadIn
 LONG WINAPI AppPolicyGetWindowingModel(HANDLE processToken, AppPolicyWindowingModel *policy);
 LONG WINAPI GetPackagesByPackageFamily(const WCHAR *family_name, UINT32 *count, WCHAR **full_names,
         UINT32 *buffer_length, WCHAR *buffer);
+LONG WINAPI PackageFullNameFromId(const PACKAGE_ID *package_id, UINT32 *length, WCHAR *full_name);
 LONG WINAPI PackageIdFromFullName(const WCHAR *full_name, UINT32 flags, UINT32 *buffer_length, BYTE *buffer);
 
 #if defined(__cplusplus)
-- 
2.30.2




More information about the wine-devel mailing list