Rob Shearman : setupapi: Partially implement SetupQueryInfOriginalFileInformationW.

Alexandre Julliard julliard at wine.codeweavers.com
Fri May 4 07:11:09 CDT 2007


Module: wine
Branch: master
Commit: c572ddb40c461d9f945e33169493ef82ce11ab6a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c572ddb40c461d9f945e33169493ef82ce11ab6a

Author: Rob Shearman <rob at codeweavers.com>
Date:   Thu May  3 22:41:04 2007 +0100

setupapi: Partially implement SetupQueryInfOriginalFileInformationW.

Implement SetupQueryInfOriginalFileInformationA on top of SetupQueryInfOriginalFileInformationW.

---

 dlls/setupapi/query.c      |   52 +++++++++++++++++++++++++++++++++++++++++--
 dlls/setupapi/tests/misc.c |   38 ++++++++++++++++++++++++++++++++
 2 files changed, 87 insertions(+), 3 deletions(-)

diff --git a/dlls/setupapi/query.c b/dlls/setupapi/query.c
index a580b92..1961375 100644
--- a/dlls/setupapi/query.c
+++ b/dlls/setupapi/query.c
@@ -616,9 +616,31 @@ BOOL WINAPI SetupQueryInfOriginalFileInformationA(
     PSP_ALTPLATFORM_INFO AlternativePlatformInfo,
     PSP_ORIGINAL_FILE_INFO_A OriginalFileInfo)
 {
-    FIXME("(%p, %d, %p, %p): stub\n", InfInformation, InfIndex,
+    BOOL ret;
+    SP_ORIGINAL_FILE_INFO_W OriginalFileInfoW;
+
+    TRACE("(%p, %d, %p, %p)\n", InfInformation, InfIndex,
         AlternativePlatformInfo, OriginalFileInfo);
-    return FALSE;
+
+    if (OriginalFileInfo->cbSize != sizeof(*OriginalFileInfo))
+    {
+        ERR("incorrect OriginalFileInfo->cbSize of %d\n", OriginalFileInfo->cbSize);
+        SetLastError( ERROR_INVALID_USER_BUFFER );
+        return FALSE;
+    }
+
+    OriginalFileInfoW.cbSize = sizeof(OriginalFileInfoW);
+    ret = SetupQueryInfOriginalFileInformationW(InfInformation, InfIndex,
+        AlternativePlatformInfo, &OriginalFileInfoW);
+    if (ret)
+    {
+        WideCharToMultiByte(CP_ACP, 0, OriginalFileInfoW.OriginalInfName, MAX_PATH,
+            OriginalFileInfo->OriginalInfName, MAX_PATH, NULL, NULL);
+        WideCharToMultiByte(CP_ACP, 0, OriginalFileInfoW.OriginalCatalogName, MAX_PATH,
+            OriginalFileInfo->OriginalCatalogName, MAX_PATH, NULL, NULL);
+    }
+
+    return ret;
 }
 
 /***********************************************************************
@@ -629,7 +651,31 @@ BOOL WINAPI SetupQueryInfOriginalFileInformationW(
     PSP_ALTPLATFORM_INFO AlternativePlatformInfo,
     PSP_ORIGINAL_FILE_INFO_W OriginalFileInfo)
 {
+    LPCWSTR inf_name;
+
     FIXME("(%p, %d, %p, %p): stub\n", InfInformation, InfIndex,
         AlternativePlatformInfo, OriginalFileInfo);
-    return FALSE;
+
+    if (OriginalFileInfo->cbSize != sizeof(*OriginalFileInfo))
+    {
+        ERR("incorrect OriginalFileInfo->cbSize of %d\n", OriginalFileInfo->cbSize);
+        return ERROR_INVALID_USER_BUFFER;
+    }
+
+    /* FIXME: we should get OriginalCatalogName from CatalogFile line in
+     * the original inf file and cache it, but that would require building a
+     * .pnf file. */
+    OriginalFileInfo->OriginalCatalogName[0] = '\0';
+
+    /* FIXME: not quite correct as we just return the same file name as
+     * destination (copied) inf file, not the source (original) inf file.
+     * to fix it properly would require building a .pnf file */
+    /* file name is stored in VersionData field of InfInformation */
+    inf_name = strrchrW((LPWSTR)&InfInformation->VersionData[0], '\\');
+    if (inf_name) inf_name++;
+    else inf_name = (LPWSTR)&InfInformation->VersionData[0];
+
+    strcpyW(OriginalFileInfo->OriginalInfName, inf_name);
+
+    return TRUE;
 }
diff --git a/dlls/setupapi/tests/misc.c b/dlls/setupapi/tests/misc.c
index e6beba5..84b1ce1 100644
--- a/dlls/setupapi/tests/misc.c
+++ b/dlls/setupapi/tests/misc.c
@@ -103,6 +103,42 @@ static BOOL check_format(LPSTR path, LPSTR inf)
     return (!inf) ? res : res && (inf == path + lstrlen(check) - 3);
 }
 
+static void test_original_file_name(LPCSTR original, LPCSTR dest)
+{
+    HINF hinf;
+    PSP_INF_INFORMATION pspii;
+    SP_ORIGINAL_FILE_INFO spofi;
+    BOOL res;
+    DWORD size;
+
+    hinf = SetupOpenInfFileA(dest, NULL, INF_STYLE_WIN4, NULL);
+    ok(hinf != NULL, "SetupOpenInfFileA failed with error %d\n", GetLastError());
+
+    res = SetupGetInfInformation(hinf, INFINFO_INF_SPEC_IS_HINF, NULL, 0, &size);
+    ok(res, "SetupGetInfInformation failed with error %d\n", GetLastError());
+
+    pspii = HeapAlloc(GetProcessHeap(), 0, size);
+
+    res = SetupGetInfInformation(hinf, INFINFO_INF_SPEC_IS_HINF, pspii, size, NULL);
+    ok(res, "SetupGetInfInformation failed with error %d\n", GetLastError());
+
+    spofi.cbSize = 0;
+    res = SetupQueryInfOriginalFileInformationA(pspii, 0, NULL, &spofi);
+    ok(!res && GetLastError() == ERROR_INVALID_USER_BUFFER,
+        "SetupQueryInfOriginalFileInformationA should have failed with ERROR_INVALID_USER_BUFFER instead of %d\n", GetLastError());
+
+    spofi.cbSize = sizeof(spofi);
+    res = SetupQueryInfOriginalFileInformationA(pspii, 0, NULL, &spofi);
+    ok(res, "SetupQueryInfOriginalFileInformationA failed with error %d\n", GetLastError());
+    ok(!spofi.OriginalCatalogName[0], "spofi.OriginalCatalogName should have been \"\" instead of \"%s\"\n", spofi.OriginalCatalogName);
+    todo_wine
+    ok(!strcmp(original, spofi.OriginalInfName), "spofi.OriginalInfName of %s didn't match real original name %s\n", spofi.OriginalInfName, original);
+
+    HeapFree(GetProcessHeap(), 0, pspii);
+
+    SetupCloseInfFile(hinf);
+}
+
 static void test_SetupCopyOEMInf(void)
 {
     CHAR toolong[MAX_PATH * 2];
@@ -233,6 +269,8 @@ static void test_SetupCopyOEMInf(void)
     ok(file_exists(path), "Expected source inf to exist\n");
     ok(size == lstrlen(dest_save) + 1, "Expected size to be lstrlen(dest_save) + 1\n");
 
+    test_original_file_name(strrchr(path, '\\') + 1, dest);
+
     /* get the DestinationInfFileName, DestinationInfFileNameSize, and DestinationInfFileNameComponent */
     SetLastError(0xdeadbeef);
     res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, MAX_PATH, &size, &inf);




More information about the wine-cvs mailing list