From: Tobias G��rgens tobi.goergens@gmail.com
--- dlls/cabinet/cabinet.rc | 22 +++++++++ dlls/cabinet/cabinet.spec | 31 ++++++------ dlls/cabinet/cabinet_main.c | 94 ++++++++++++++++++++++++++++++------ dlls/cabinet/tests/version.c | 35 ++++++-------- 4 files changed, 135 insertions(+), 47 deletions(-)
diff --git a/dlls/cabinet/cabinet.rc b/dlls/cabinet/cabinet.rc index 8a022909d5c..bf045d53c28 100644 --- a/dlls/cabinet/cabinet.rc +++ b/dlls/cabinet/cabinet.rc @@ -26,3 +26,25 @@ #define WINE_PRODUCTVERSION_STR "5.0"
#include "wine/wine_common_ver.rc" + +100 VERSIONINFO +FILEVERSION WINE_FILEVERSION +PRODUCTVERSION WINE_PRODUCTVERSION +FILEOS VOS_NT +FILETYPE VFT_DLL +{ + BLOCK "StringFileInfo" + { + BLOCK "1200" + { + VALUE "FileDescription", WINE_FILEDESCRIPTION_STR + VALUE "FileVersion", WINE_FILEVERSION + VALUE "FileVersionStr", WINE_FILEVERSION_STR + VALUE "InternalName", WINE_FILENAME + VALUE "LegalCopyright", WINE_LEGALCOPYRIGHT + VALUE "OriginalFilename", WINE_FILENAME_STR + VALUE "ProductName", WINE_PRODUCTNAME_STR + VALUE "ProductVersion", WINE_PRODUCTVERSION_STR + } + } +} diff --git a/dlls/cabinet/cabinet.spec b/dlls/cabinet/cabinet.spec index 96127cfc429..1953582e1de 100644 --- a/dlls/cabinet/cabinet.spec +++ b/dlls/cabinet/cabinet.spec @@ -1,14 +1,17 @@ -1 stub GetDllVersion -2 stdcall -private DllGetVersion (ptr) -3 stdcall Extract(ptr str) -4 stub DeleteExtractedFiles -10 cdecl FCICreate(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) -11 cdecl FCIAddFile(long ptr ptr long ptr ptr ptr long) -12 cdecl FCIFlushFolder(long ptr ptr) -13 cdecl FCIFlushCabinet(long long ptr ptr) -14 cdecl FCIDestroy(long) -20 cdecl FDICreate(ptr ptr ptr ptr ptr ptr ptr long ptr) -21 cdecl FDIIsCabinet(long long ptr) -22 cdecl FDICopy(long ptr ptr long ptr ptr ptr) -23 cdecl FDIDestroy(long) -24 cdecl FDITruncateCabinet(long ptr long) +@ stdcall -import GetFileVersionInfoA(str long long ptr) +@ stdcall -import GetFileVersionInfoSizeA(str ptr) +@ stdcall -import VerQueryValueA(ptr str ptr ptr) +@ stub GetDllVersion() +@ stdcall -private DllGetVersion (ptr) +@ stdcall Extract(ptr str) +@ stub DeleteExtractedFiles +@ cdecl FCICreate(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ cdecl FCIAddFile(long ptr ptr long ptr ptr ptr long) +@ cdecl FCIFlushFolder(long ptr ptr) +@ cdecl FCIFlushCabinet(long long ptr ptr) +@ cdecl FCIDestroy(long) +@ cdecl FDICreate(ptr ptr ptr ptr ptr ptr ptr long ptr) +@ cdecl FDIIsCabinet(long long ptr) +@ cdecl FDICopy(long ptr ptr long ptr ptr ptr) +@ cdecl FDIDestroy(long) +@ cdecl FDITruncateCabinet(long ptr long) diff --git a/dlls/cabinet/cabinet_main.c b/dlls/cabinet/cabinet_main.c index f95eca93c52..b35226b2c9d 100644 --- a/dlls/cabinet/cabinet_main.c +++ b/dlls/cabinet/cabinet_main.c @@ -36,34 +36,100 @@
WINE_DEFAULT_DEBUG_CHANNEL(cabinet);
- /*********************************************************************** * DllGetVersion (CABINET.2) * - * Retrieves version information of the 'CABINET.DLL' + * Retrieves version information of the 'CABINET.DLL' using the + * CABINETDLLVERSIONINFO structure * * PARAMS - * pdvi [O] pointer to version information structure. + * cabVerInfo [O] pointer to CABINETDLLVERSIONINFO structure. * * RETURNS - * Success: S_OK - * Failure: E_INVALIDARG + * This function has no return value * * NOTES - * Supposedly returns version from IE6SP1RP1 + * Success: cabVerInfo points to mutet CABINETDLLVERSIONINFO structure + * Failure: cabVerInfo points to unmutet CABINETDLLVERSIONINFO structure + * Use GetLastError() to find out more about why the function failed + * */ -HRESULT WINAPI DllGetVersion (DLLVERSIONINFO *pdvi) + +VOID WINAPI DllGetVersion(PCABINETDLLVERSIONINFO cabVerInfo) { - WARN("hmmm... not right version number "5.1.1106.1"?\n");
- if (pdvi->cbSize != sizeof(DLLVERSIONINFO)) return E_INVALIDARG; + LPCSTR filename; + LPCSTR subBlock; + DWORD lenVersionInfo; + VOID *data; + VOID *buffer; + UINT lenRoot; + DWORD *handleVerInfo; + VS_FIXEDFILEINFO *versionInfo; + + filename = "Cabinet.dll"; + subBlock = "\"; + lenRoot = 0; + + if (cabVerInfo == NULL){ + SetLastError(ERROR_INVALID_PARAMETER); + TRACE("Bad Parameter: Error = %ld.\n", GetLastError()); + return; + } + + handleVerInfo = malloc(sizeof(DWORD)); + if (handleVerInfo == NULL){ + SetLastError(ERROR_OUTOFMEMORY); + TRACE("Cannot create handleVerInfo: Out of memory: Error = %ld.\n", GetLastError()); + return; + } + + lenVersionInfo = GetFileVersionInfoSizeA(filename, handleVerInfo); + if (lenVersionInfo == 0){ + TRACE("Cannot set lenVersionInfo: Couldn't parse File Version Info Size: Error = %ld.\n", GetLastError()); + return; + } + + data=HeapAlloc(GetProcessHeap(), 0, lenVersionInfo); + if (data == NULL) { + SetLastError(ERROR_OUTOFMEMORY); + TRACE("Cannot create data: Out of memory: Error = %ld.\n", GetLastError()); + return; + } +
- pdvi->dwMajorVersion = 5; - pdvi->dwMinorVersion = 1; - pdvi->dwBuildNumber = 1106; - pdvi->dwPlatformID = 1; + if (GetFileVersionInfoA(filename, 0, lenVersionInfo, data) == 0){ + TRACE("Cannot get FileVersionInfo: Couldn't parse File Version Info Ressource: Error = %ld.\n", GetLastError()); + return; + }
- return S_OK; + if (VerQueryValueA(data, subBlock, &buffer, &lenRoot) == 0){ + TRACE("Cannot query version info: Couldn't parse File Version Info Value: Error = %ld.\n", GetLastError()); + return; + } + else + { + if (lenRoot != 0) + { + versionInfo = (VS_FIXEDFILEINFO *)buffer; + if (versionInfo->dwSignature == 0xfeef04bd) + { + cabVerInfo->cbStruct = sizeof(CABINETDLLVERSIONINFO); + cabVerInfo->dwFileVersionMS = versionInfo->dwFileVersionMS; + cabVerInfo->dwFileVersionLS = versionInfo->dwFileVersionLS; + } + else + { + TRACE("Cannot verify struct: Version information has wrong signature: Error = %ld.\n", GetLastError()); + return; + } + } + else + { + TRACE("Cannot access struct: The length of the buffer holding version information is 0: Error = %ld.\n", GetLastError()); + return; + } + } }
/* FDI callback functions */ diff --git a/dlls/cabinet/tests/version.c b/dlls/cabinet/tests/version.c index 60f5dc74efe..3b4040ad383 100644 --- a/dlls/cabinet/tests/version.c +++ b/dlls/cabinet/tests/version.c @@ -29,33 +29,30 @@ static void test_dllget(HMODULE libHandle) int revisV;
f_dllget DllGetVersion = (f_dllget)GetProcAddress(libHandle, "DllGetVersion"); - todo_wine { - /* FIXME - Currently DllGetVersion isn't implemented correctly */ - ok(libHandle != NULL, "Function DllGetVersion in DLL not found: Error = %ld.\n", GetLastError()); - + ok(libHandle != NULL, "Function DllGetVersion in DLL not found: Error = %ld.\n", GetLastError());
- verInfo = malloc(sizeof(CABINETDLLVERSIONINFO)); - ok(verInfo != NULL, "Couldn't allocate memory to run tests properly!\n"); - DllGetVersion(verInfo);
- FileVersionMS = verInfo->dwFileVersionMS; - FileVersionLS = verInfo->dwFileVersionLS; + verInfo = malloc(sizeof(CABINETDLLVERSIONINFO)); + ok(verInfo != NULL, "Couldn't allocate memory to run tests properly!\n"); + DllGetVersion(verInfo);
- /*length of 4 DWORDs + buffer*/ - sizeVerInfo = 32; + FileVersionMS = verInfo->dwFileVersionMS; + FileVersionLS = verInfo->dwFileVersionLS;
- version = malloc(sizeVerInfo); + /*length of 4 DWORDs + buffer*/ + sizeVerInfo = 32;
+ version = malloc(sizeVerInfo); + ok(version != NULL, "Couldn't allocate memory to run tests properly!\n");
- majorV = (int)( FileVersionMS >> 16 ) & 0xffff; - minorV = (int)( FileVersionMS >> 0 ) & 0xffff; - buildV = (int)( FileVersionLS >> 16 ) & 0xffff; - revisV = (int)( FileVersionLS >> 0 ) & 0xffff; + majorV = (int)( FileVersionMS >> 16 ) & 0xffff; + minorV = (int)( FileVersionMS >> 0 ) & 0xffff; + buildV = (int)( FileVersionLS >> 16 ) & 0xffff; + revisV = (int)( FileVersionLS >> 0 ) & 0xffff;
- snprintf(version, sizeVerInfo, "%d.%d.%d.%d\n",majorV,minorV,buildV,revisV);; + snprintf(version, sizeVerInfo, "%d.%d.%d.%d\n",majorV,minorV,buildV,revisV);;
- ok(strcmp(version,"") != 0, "Cabinet struct doesn't contain correct version: Error = %ld.\n", GetLastError()); - } + ok(strcmp(version,"") != 0, "Cabinet struct doesn't contain correct version: Error = %ld.\n", GetLastError()); }