Module: wine Branch: master Commit: b45cfc123eb6c341376edb9ef1d8f63be78255a6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b45cfc123eb6c341376edb9ef1...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Jan 5 20:26:50 2009 +0100
setupapi: Implemented SetupEnumInfSectionsA/W.
---
dlls/setupapi/parser.c | 69 +++++++++++++++++++++++++++++++++++++++++++ dlls/setupapi/setupapi.spec | 2 + include/setupapi.h | 4 +- 3 files changed, 73 insertions(+), 2 deletions(-)
diff --git a/dlls/setupapi/parser.c b/dlls/setupapi/parser.c index 656fb78..00d3373 100644 --- a/dlls/setupapi/parser.c +++ b/dlls/setupapi/parser.c @@ -1245,6 +1245,75 @@ void WINAPI SetupCloseInfFile( HINF hinf )
/*********************************************************************** + * SetupEnumInfSectionsA (SETUPAPI.@) + */ +BOOL WINAPI SetupEnumInfSectionsA( HINF hinf, UINT index, PSTR buffer, DWORD size, DWORD *need ) +{ + struct inf_file *file = hinf; + + for (file = hinf; file; file = file->next) + { + if (index < file->nb_sections) + { + DWORD len = WideCharToMultiByte( CP_ACP, 0, file->sections[index]->name, -1, + NULL, 0, NULL, NULL ); + if (*need) *need = len; + if (!buffer) + { + if (!size) return TRUE; + SetLastError( ERROR_INVALID_USER_BUFFER ); + return FALSE; + } + if (len > size) + { + SetLastError( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } + WideCharToMultiByte( CP_ACP, 0, file->sections[index]->name, -1, buffer, size, NULL, NULL ); + return TRUE; + } + index -= file->nb_sections; + } + SetLastError( ERROR_NO_MORE_ITEMS ); + return FALSE; +} + + +/*********************************************************************** + * SetupEnumInfSectionsW (SETUPAPI.@) + */ +BOOL WINAPI SetupEnumInfSectionsW( HINF hinf, UINT index, PWSTR buffer, DWORD size, DWORD *need ) +{ + struct inf_file *file = hinf; + + for (file = hinf; file; file = file->next) + { + if (index < file->nb_sections) + { + DWORD len = strlenW( file->sections[index]->name ) + 1; + if (*need) *need = len; + if (!buffer) + { + if (!size) return TRUE; + SetLastError( ERROR_INVALID_USER_BUFFER ); + return FALSE; + } + if (len > size) + { + SetLastError( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } + memcpy( buffer, file->sections[index]->name, len * sizeof(WCHAR) ); + return TRUE; + } + index -= file->nb_sections; + } + SetLastError( ERROR_NO_MORE_ITEMS ); + return FALSE; +} + + +/*********************************************************************** * SetupGetLineCountA (SETUPAPI.@) */ LONG WINAPI SetupGetLineCountA( HINF hinf, PCSTR name ) diff --git a/dlls/setupapi/setupapi.spec b/dlls/setupapi/setupapi.spec index 2996803..03435bc 100644 --- a/dlls/setupapi/setupapi.spec +++ b/dlls/setupapi/setupapi.spec @@ -389,6 +389,8 @@ @ stub SetupDiUnremoveDevice @ stub SetupDuplicateDiskSpaceListA @ stub SetupDuplicateDiskSpaceListW +@ stdcall SetupEnumInfSectionsA(long long ptr long ptr) +@ stdcall SetupEnumInfSectionsW(long long ptr long ptr) @ stdcall SetupFindFirstLineA(long str str ptr) @ stdcall SetupFindFirstLineW(long wstr wstr ptr) @ stdcall SetupFindNextLine(ptr ptr) diff --git a/include/setupapi.h b/include/setupapi.h index 0e9cbbb..820c5c4 100644 --- a/include/setupapi.h +++ b/include/setupapi.h @@ -1633,8 +1633,8 @@ BOOL WINAPI SetupDiUnremoveDevice(HDEVINFO, PSP_DEVINFO_DATA); HDSKSPC WINAPI SetupDuplicateDiskSpaceListA(HDSKSPC, PVOID, DWORD, UINT); HDSKSPC WINAPI SetupDuplicateDiskSpaceListW(HDSKSPC, PVOID, DWORD, UINT); #define SetupDuplicateDiskSpaceList WINELIB_NAME_AW(SetupDuplicateDiskSpaceList) -BOOL WINAPI SetupEnumInfSectionsA(HINF, UINT, PSTR, SIZE, UINT *); -BOOL WINAPI SetupEnumInfSectionsW(HINF, UINT, PWSTR, SIZE, UINT *); +BOOL WINAPI SetupEnumInfSectionsA(HINF, UINT, PSTR, DWORD, DWORD *); +BOOL WINAPI SetupEnumInfSectionsW(HINF, UINT, PWSTR, DWORD, DWORD *); #define SetupEnumInfSections WINELIB_NAME_AW(SetupEnumInfSections) BOOL WINAPI SetupFindFirstLineA( HINF hinf, PCSTR section, PCSTR key, INFCONTEXT *context ); BOOL WINAPI SetupFindFirstLineW( HINF hinf, PCWSTR section, PCWSTR key, INFCONTEXT *context );