Implement SetupDiGetINFClassW
Modified: trunk/reactos/lib/setupapi/parser.c
Modified: trunk/reactos/lib/setupapi/setupapi.spec
_____
Modified: trunk/reactos/lib/setupapi/parser.c
--- trunk/reactos/lib/setupapi/parser.c 2005-10-06 21:39:18 UTC (rev
18302)
+++ trunk/reactos/lib/setupapi/parser.c 2005-10-06 22:36:14 UTC (rev
18303)
@@ -2,6 +2,7 @@
* INF file parsing
*
* Copyright 2002 Alexandre Julliard for CodeWeavers
+ * 2005 HervÚ Poussineau (hpoussin(a)reactos.org)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -35,6 +36,7 @@
#include "winreg.h"
#include "winternl.h"
#include "winerror.h"
+#include "cfgmgr32.h"
#include "setupapi.h"
#include "setupapi_private.h"
@@ -2071,3 +2073,83 @@
HeapFree(GetProcessHeap(), 0, pFileSpecification);
return ret;
}
+
+/**********************************************************************
*
+ * SetupDiGetINFClassW (SETUPAPI.@)
+ */
+BOOL WINAPI
+SetupDiGetINFClassW(
+ IN PCWSTR InfName,
+ OUT LPGUID ClassGuid,
+ OUT PWSTR ClassName,
+ IN DWORD ClassNameSize,
+ OUT PDWORD RequiredSize OPTIONAL)
+{
+ HINF hInf = INVALID_HANDLE_VALUE;
+ DWORD requiredSize;
+ WCHAR guidW[MAX_GUID_STRING_LEN + 1];
+ BOOL ret = FALSE;
+
+ TRACE("%S %p %p %ld %p\n", InfName, ClassGuid,
+ ClassName, ClassNameSize, RequiredSize);
+
+ /* Open .inf file */
+ hInf = SetupOpenInfFileW(InfName, NULL, INF_STYLE_WIN4, NULL);
+ if (hInf == INVALID_HANDLE_VALUE)
+ goto cleanup;
+
+ /* Read class Guid */
+ if (!SetupGetLineTextW(NULL, hInf, L"Version", L"ClassGUID",
guidW,
sizeof(guidW), NULL))
+ goto cleanup;
+ guidW[37] = '\0'; /* Replace the } by a NULL character */
+ if (UuidFromStringW(&guidW[1], ClassGuid) != RPC_S_OK)
+ goto cleanup;
+
+ /* Read class name */
+ ret = SetupGetLineTextW(NULL, hInf, L"Version", L"Class",
ClassName, ClassNameSize, &requiredSize);
+ if (ret && ClassName == NULL && ClassNameSize == 0)
+ {
+ if (RequiredSize)
+ *RequiredSize = requiredSize;
+ SetLastError(ERROR_INSUFFICIENT_BUFFER);
+ ret = FALSE;
+ goto cleanup;
+ }
+ if (!ret)
+ {
+ if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
+ {
+ if (RequiredSize)
+ *RequiredSize = requiredSize;
+ goto cleanup;
+ }
+ else if (!SetupDiClassNameFromGuidW(ClassGuid, ClassName,
ClassNameSize, &requiredSize))
+ {
+ if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
+ {
+ if (RequiredSize)
+ *RequiredSize = requiredSize;
+ goto cleanup;
+ }
+ /* Return a NULL class name */
+ if (RequiredSize)
+ *RequiredSize = 1;
+ if (ClassNameSize < 1)
+ {
+ SetLastError(ERROR_INSUFFICIENT_BUFFER);
+ goto cleanup;
+ }
+ memcpy(ClassGuid, &GUID_NULL, sizeof(GUID));
+ *ClassName = UNICODE_NULL;
+ }
+ }
+
+ ret = TRUE;
+
+cleanup:
+ if (hInf != INVALID_HANDLE_VALUE)
+ SetupCloseInfFile(hInf);
+
+ TRACE("Returning %d\n", ret);
+ return ret;
+}
_____
Modified: trunk/reactos/lib/setupapi/setupapi.spec
--- trunk/reactos/lib/setupapi/setupapi.spec 2005-10-06 21:39:18 UTC
(rev 18302)
+++ trunk/reactos/lib/setupapi/setupapi.spec 2005-10-06 22:36:14 UTC
(rev 18303)
@@ -342,7 +342,7 @@
@ stub SetupDiGetHwProfileListExA
@ stub SetupDiGetHwProfileListExW
@ stub SetupDiGetINFClassA
-@ stub SetupDiGetINFClassW
+@ stdcall SetupDiGetINFClassW(wstr ptr ptr long ptr)
@ stub SetupDiGetSelectedDevice
@ stub SetupDiGetSelectedDriverA
@ stdcall SetupDiGetSelectedDriverW(ptr ptr ptr)