Author: akhaldi
Date: Sun Mar 29 17:22:16 2015
New Revision: 66970

URL: http://svn.reactos.org/svn/reactos?rev=66970&view=rev
Log:
* Back down r66964 for now.

Modified:
    trunk/reactos/dll/win32/setupapi/parser.c

Modified: trunk/reactos/dll/win32/setupapi/parser.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/setupapi/parser.c?rev=66970&r1=66969&r2=66970&view=diff
==============================================================================
--- trunk/reactos/dll/win32/setupapi/parser.c   [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/setupapi/parser.c   [iso-8859-1] Sun Mar 29 
17:22:16 2015
@@ -2120,143 +2120,137 @@
     return field->text;
 }
 
-
-/***********************************************************************
- *              SetupGetInfFileListW  (SETUPAPI.@)
- */
-BOOL WINAPI SetupGetInfFileListW(PCWSTR dir, DWORD style, PWSTR buffer,
-                                 DWORD insize, PDWORD outsize)
-{
-    static const WCHAR inf[] = {'\\','*','.','i','n','f',0 };
-    WCHAR *filter, *fullname = NULL, *ptr = buffer;
-    DWORD dir_len, name_len = 20, size ;
-    WIN32_FIND_DATAW finddata;
-    HANDLE hdl;
-    if (style & ~( INF_STYLE_OLDNT | INF_STYLE_WIN4 |
-                   INF_STYLE_CACHE_ENABLE | INF_STYLE_CACHE_DISABLE ))
-    {
-        FIXME( "unknown inf_style(s) 0x%x\n",
-               style & ~( INF_STYLE_OLDNT | INF_STYLE_WIN4 |
-                         INF_STYLE_CACHE_ENABLE | INF_STYLE_CACHE_DISABLE ));
-        if( outsize ) *outsize = 1;
-        return TRUE;
-    }
-    if ((style & ( INF_STYLE_OLDNT | INF_STYLE_WIN4 )) == INF_STYLE_NONE)
-    {
-        FIXME( "inf_style INF_STYLE_NONE not handled\n" );
-        if( outsize ) *outsize = 1;
-        return TRUE;
-    }
-    if (style & ( INF_STYLE_CACHE_ENABLE | INF_STYLE_CACHE_DISABLE ))
-        FIXME("ignored inf_style(s) %s %s\n",
-              ( style & INF_STYLE_CACHE_ENABLE  ) ? "INF_STYLE_CACHE_ENABLE"  
: "",
-              ( style & INF_STYLE_CACHE_DISABLE ) ? "INF_STYLE_CACHE_DISABLE" 
: "");
-    if( dir )
-    {
-        DWORD att;
-        DWORD msize;
-        dir_len = strlenW( dir );
-        if ( !dir_len ) return FALSE;
-        msize = ( 7 + dir_len )  * sizeof( WCHAR ); /* \\*.inf\0 */
-        filter = HeapAlloc( GetProcessHeap(), 0, msize );
-        if( !filter )
-        {
-            SetLastError( ERROR_NOT_ENOUGH_MEMORY );
-            return FALSE;
-        }
-        strcpyW( filter, dir );
-        if ( '\\' == filter[dir_len - 1] )
-            filter[--dir_len] = 0;
-
-        att = GetFileAttributesW( filter );
-        if (att != INVALID_FILE_ATTRIBUTES && !(att & 
FILE_ATTRIBUTE_DIRECTORY))
-        {
-            HeapFree( GetProcessHeap(), 0, filter );
-            SetLastError( ERROR_DIRECTORY );
-            return FALSE;
-        }
-    }
+/***********************************************************************
+ *             SetupGetInfFileListW    (SETUPAPI.@)
+ */
+BOOL WINAPI
+SetupGetInfFileListW(
+    IN PCWSTR DirectoryPath OPTIONAL,
+    IN DWORD InfStyle,
+    IN OUT PWSTR ReturnBuffer OPTIONAL,
+    IN DWORD ReturnBufferSize OPTIONAL,
+    OUT PDWORD RequiredSize OPTIONAL)
+{
+    HANDLE hSearch;
+    LPWSTR pFullFileName = NULL;
+    LPWSTR pFileName; /* Pointer into pFullFileName buffer */
+    LPWSTR pBuffer = ReturnBuffer;
+    WIN32_FIND_DATAW wfdFileInfo;
+    size_t len;
+    DWORD requiredSize = 0;
+    BOOL ret = FALSE;
+
+    TRACE("%s %lx %p %ld %p\n", debugstr_w(DirectoryPath), InfStyle,
+        ReturnBuffer, ReturnBufferSize, RequiredSize);
+
+    if (InfStyle & ~(INF_STYLE_OLDNT | INF_STYLE_WIN4))
+    {
+        TRACE("Unknown flags: 0x%08lx\n", InfStyle & ~(INF_STYLE_OLDNT  | 
INF_STYLE_WIN4));
+        SetLastError(ERROR_INVALID_PARAMETER);
+        goto cleanup;
+    }
+    else if (ReturnBufferSize == 0 && ReturnBuffer != NULL)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        goto cleanup;
+    }
+    else if (ReturnBufferSize > 0 && ReturnBuffer == NULL)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        goto cleanup;
+    }
+
+    /* Allocate memory for file filter */
+    if (DirectoryPath != NULL)
+        /* "DirectoryPath\" form */
+        len = strlenW(DirectoryPath) + 1 + 1;
     else
-    {
-        WCHAR infdir[] = {'\\','i','n','f',0 };
-        DWORD msize;
-        dir_len = GetWindowsDirectoryW( NULL, 0 );
-        msize = ( 7 + 4 + dir_len ) * sizeof( WCHAR );
-        filter = HeapAlloc( GetProcessHeap(), 0, msize );
-        if( !filter )
-        {
-            SetLastError( ERROR_NOT_ENOUGH_MEMORY );
-            return FALSE;
-        }
-        GetWindowsDirectoryW( filter, msize );
-        strcatW( filter, infdir );
-    }
-    strcatW( filter, inf );
-
-    hdl = FindFirstFileW( filter , &finddata );
-    if ( hdl == INVALID_HANDLE_VALUE )
-    {
-        if( outsize ) *outsize = 1;
-        HeapFree( GetProcessHeap(), 0, filter );
-        return TRUE;
-    }
-    size = 1;
+        /* "%SYSTEMROOT%\Inf\" form */
+        len = MAX_PATH + 1 + strlenW(InfDirectory) + 1;
+    len += MAX_PATH; /* To contain file name or "*.inf" string */
+    pFullFileName = MyMalloc(len * sizeof(WCHAR));
+    if (pFullFileName == NULL)
+    {
+        SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+        goto cleanup;
+    }
+
+    /* Fill file filter buffer */
+    if (DirectoryPath)
+    {
+        strcpyW(pFullFileName, DirectoryPath);
+        if (*pFullFileName && pFullFileName[strlenW(pFullFileName) - 1] != 
'\\')
+            strcatW(pFullFileName, BackSlash);
+    }
+    else
+    {
+        len = GetSystemWindowsDirectoryW(pFullFileName, MAX_PATH);
+        if (len == 0 || len > MAX_PATH)
+            goto cleanup;
+        if (pFullFileName[strlenW(pFullFileName) - 1] != '\\')
+            strcatW(pFullFileName, BackSlash);
+        strcatW(pFullFileName, InfDirectory);
+    }
+    pFileName = &pFullFileName[strlenW(pFullFileName)];
+
+    /* Search for the first file */
+    strcpyW(pFileName, InfFileSpecification);
+    hSearch = FindFirstFileW(pFullFileName, &wfdFileInfo);
+    if (hSearch == INVALID_HANDLE_VALUE)
+    {
+        TRACE("No file returned by %s\n", debugstr_w(pFullFileName));
+        goto cleanup;
+    }
+
     do
     {
-        static const WCHAR key[] =
-               {'S','i','g','n','a','t','u','r','e',0 };
-        static const WCHAR section[] =
-               {'V','e','r','s','i','o','n',0 };
-        static const WCHAR sig_win4_1[] =
-               {'$','C','h','i','c','a','g','o','$',0 };
-        static const WCHAR sig_win4_2[] =
-               {'$','W','I','N','D','O','W','S',' ','N','T','$',0 };
-        WCHAR signature[ MAX_PATH ];
-        BOOL valid = FALSE;
-        DWORD len = strlenW( finddata.cFileName );
-        if (!fullname || ( name_len < len ))
-        {
-            name_len = ( name_len < len ) ? len : name_len;
-            HeapFree( GetProcessHeap(), 0, fullname );
-            fullname = HeapAlloc( GetProcessHeap(), 0,
-                                  ( 2 + dir_len + name_len) * sizeof( WCHAR ));
-            if( !fullname )
+        HINF hInf;
+
+        strcpyW(pFileName, wfdFileInfo.cFileName);
+        hInf = SetupOpenInfFileW(
+            pFullFileName,
+            NULL, /* Inf class */
+            InfStyle,
+            NULL /* Error line */);
+        if (hInf == INVALID_HANDLE_VALUE)
+        {
+            if (GetLastError() == ERROR_CLASS_MISMATCH)
             {
-                FindClose( hdl );
-                HeapFree( GetProcessHeap(), 0, filter );
-                SetLastError( ERROR_NOT_ENOUGH_MEMORY );
-                return FALSE;
+                /* InfStyle was not correct. Skip this file */
+                continue;
             }
-            strcpyW( fullname, filter );
-        }
-        fullname[ dir_len + 1] = 0; /* keep '\\' */
-        strcatW( fullname, finddata.cFileName );
-        if (!GetPrivateProfileStringW( section, key, NULL, signature, 
MAX_PATH, fullname ))
-            signature[0] = 0;
-        if( INF_STYLE_OLDNT & style )
-            valid = strcmpiW( sig_win4_1, signature ) &&
-                    strcmpiW( sig_win4_2, signature );
-        if( INF_STYLE_WIN4 & style )
-            valid = valid || !strcmpiW( sig_win4_1, signature ) ||
-                    !strcmpiW( sig_win4_2, signature );
-        if( valid )
-        {
-            size += 1 + strlenW( finddata.cFileName );
-            if( ptr && insize >= size )
-            {
-                strcpyW( ptr, finddata.cFileName );
-                ptr += 1 + strlenW( finddata.cFileName );
-                *ptr = 0;
-            }
-        }
-    }
-    while( FindNextFileW( hdl, &finddata ));
-    FindClose( hdl );
-
-    HeapFree( GetProcessHeap(), 0, fullname );
-    HeapFree( GetProcessHeap(), 0, filter );
-    if( outsize ) *outsize = size;
-    return TRUE;
+            TRACE("Invalid .inf file %s\n", debugstr_w(pFullFileName));
+            continue;
+        }
+
+        len = strlenW(wfdFileInfo.cFileName) + 1;
+        requiredSize += (DWORD)(len * sizeof(WCHAR));
+        if (requiredSize <= ReturnBufferSize)
+        {
+            strcpyW(pBuffer, wfdFileInfo.cFileName);
+            pBuffer = &pBuffer[len];
+        }
+        SetupCloseInfFile(hInf);
+    } while (FindNextFileW(hSearch, &wfdFileInfo));
+    FindClose(hSearch);
+
+    requiredSize += sizeof(WCHAR); /* Final NULL char */
+    if (requiredSize <= ReturnBufferSize)
+    {
+        *pBuffer = '\0';
+        ret = TRUE;
+    }
+    else
+    {
+        SetLastError(ERROR_INSUFFICIENT_BUFFER);
+        ret = FALSE;
+    }
+    if (RequiredSize)
+        *RequiredSize = requiredSize;
+
+cleanup:
+    MyFree(pFullFileName);
+    return ret;
 }
 
 /***********************************************************************


Reply via email to