From 7d441d940688540fa091f6fafab522574b421d54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Thu, 6 Oct 2005 22:36:14 +0000 Subject: [PATCH] Implement SetupDiGetINFClassW svn path=/trunk/; revision=18303 --- reactos/lib/setupapi/parser.c | 82 ++++++++++++++++++++++++++++++ reactos/lib/setupapi/setupapi.spec | 2 +- 2 files changed, 83 insertions(+), 1 deletion(-) diff --git a/reactos/lib/setupapi/parser.c b/reactos/lib/setupapi/parser.c index 34645d66193..0e98e2e4c22 100644 --- a/reactos/lib/setupapi/parser.c +++ b/reactos/lib/setupapi/parser.c @@ -2,6 +2,7 @@ * INF file parsing * * Copyright 2002 Alexandre Julliard for CodeWeavers + * 2005 Hervé Poussineau (hpoussin@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 @@ SetupGetInfFileListW( 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; +} diff --git a/reactos/lib/setupapi/setupapi.spec b/reactos/lib/setupapi/setupapi.spec index 328dda6c70d..e9a42cf82be 100644 --- a/reactos/lib/setupapi/setupapi.spec +++ b/reactos/lib/setupapi/setupapi.spec @@ -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)