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