From 0d1e4994cd4f678123dda5d45945fcb8d8b37995 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Thu, 13 Nov 2008 10:33:09 -0600 Subject: [PATCH] setupapi: implement FLG_PROFITEM_GROUP --- dlls/setupapi/install.c | 109 +++++++++++++++++++++++------------------ dlls/setupapi/tests/install.c | 8 +++- include/setupapi.h | 4 ++ 3 files changed, 72 insertions(+), 49 deletions(-) diff --git a/dlls/setupapi/install.c b/dlls/setupapi/install.c index 133fb33..b7cdbb2 100644 --- a/dlls/setupapi/install.c +++ b/dlls/setupapi/install.c @@ -787,9 +787,6 @@ static BOOL profile_items_callback( HINF hinf, PCWSTR field, void *arg ) LPWSTR cmdline=NULL, lnkpath_end; unsigned int name_size; INFCONTEXT name_context, context; - IShellLinkW* shelllink=NULL; - IPersistFile* persistfile=NULL; - HRESULT initresult=E_FAIL; int attrs=0; static const WCHAR dotlnk[] = {'.','l','n','k',0}; @@ -799,7 +796,7 @@ static BOOL profile_items_callback( HINF hinf, PCWSTR field, void *arg ) if (SetupFindFirstLineW( hinf, field, Name, &name_context )) { SetupGetIntField( &name_context, 2, &attrs ); - if (attrs) FIXME( "unhandled attributes: %x\n", attrs ); + if (attrs & ~FLG_PROFITEM_GROUP) FIXME( "unhandled attributes: %x\n", attrs ); } else return TRUE; @@ -808,7 +805,7 @@ static BOOL profile_items_callback( HINF hinf, PCWSTR field, void *arg ) lnkpath_end = lnkpath + strlenW(lnkpath); if (lnkpath_end[-1] != '\\') *lnkpath_end++ = '\\'; - if (SetupFindFirstLineW( hinf, field, SubDir, &context )) + if (!(attrs&FLG_PROFITEM_GROUP) && SetupFindFirstLineW( hinf, field, SubDir, &context )) { unsigned int subdir_size; @@ -823,67 +820,83 @@ static BOOL profile_items_callback( HINF hinf, PCWSTR field, void *arg ) return TRUE; lnkpath_end += name_size - 1; - if (lnkpath+MAX_PATH < lnkpath_end + 5) return TRUE; - strcpyW( lnkpath_end, dotlnk ); + + if (!(attrs&FLG_PROFITEM_GROUP)) + { + if (lnkpath+MAX_PATH < lnkpath_end + 5) return TRUE; + strcpyW( lnkpath_end, dotlnk ); + } TRACE( "link path: %s\n", debugstr_w(lnkpath) ); - /* calculate command line */ - if (SetupFindFirstLineW( hinf, field, CmdLine, &context )) + if (attrs&FLG_PROFITEM_GROUP) { - unsigned int dir_len=0, subdir_size=0, filename_size=0; - int dirid=0; - LPCWSTR dir; - LPWSTR cmdline_end; - - SetupGetIntField( &context, 1, &dirid ); - dir = DIRID_get_string( dirid ); + SHPathPrepareForWriteW( NULL, NULL, lnkpath, SHPPFW_DIRCREATE ); + } + else + { + IShellLinkW* shelllink=NULL; + IPersistFile* persistfile=NULL; + HRESULT initresult=E_FAIL; - if (dir) dir_len = strlenW(dir); + /* calculate command line */ + if (SetupFindFirstLineW( hinf, field, CmdLine, &context )) + { + unsigned int dir_len=0, subdir_size=0, filename_size=0; + int dirid=0; + LPCWSTR dir; + LPWSTR cmdline_end; - SetupGetStringFieldW( &context, 2, NULL, 0, &subdir_size ); - SetupGetStringFieldW( &context, 3, NULL, 0, &filename_size ); + SetupGetIntField( &context, 1, &dirid ); + dir = DIRID_get_string( dirid ); - if (dir_len && filename_size) - { - cmdline = cmdline_end = HeapAlloc( GetProcessHeap(), 0, sizeof(WCHAR) * (dir_len+subdir_size+filename_size+1) ); + if (dir) dir_len = strlenW(dir); - strcpyW( cmdline_end, dir ); - cmdline_end += dir_len; - if (cmdline_end[-1] != '\\') *cmdline_end++ = '\\'; + SetupGetStringFieldW( &context, 2, NULL, 0, &subdir_size ); + SetupGetStringFieldW( &context, 3, NULL, 0, &filename_size ); - if (subdir_size) + if (dir_len && filename_size) { - SetupGetStringFieldW( &context, 2, cmdline_end, subdir_size, NULL ); - cmdline_end += subdir_size-1; + cmdline = cmdline_end = HeapAlloc( GetProcessHeap(), 0, sizeof(WCHAR) * (dir_len+subdir_size+filename_size+1) ); + + strcpyW( cmdline_end, dir ); + cmdline_end += dir_len; if (cmdline_end[-1] != '\\') *cmdline_end++ = '\\'; + + if (subdir_size) + { + SetupGetStringFieldW( &context, 2, cmdline_end, subdir_size, NULL ); + cmdline_end += subdir_size-1; + if (cmdline_end[-1] != '\\') *cmdline_end++ = '\\'; + } + SetupGetStringFieldW( &context, 3, cmdline_end, filename_size, NULL ); + TRACE( "cmdline: %s\n", debugstr_w(cmdline)); } - SetupGetStringFieldW( &context, 3, cmdline_end, filename_size, NULL ); - TRACE( "cmdline: %s\n", debugstr_w(cmdline)); } - } - if (!cmdline) return TRUE; + if (!cmdline) return TRUE; - initresult = CoInitialize(NULL); + initresult = CoInitialize(NULL); - if (!SUCCEEDED(CoCreateInstance( &CLSID_ShellLink, NULL, - CLSCTX_INPROC_SERVER, &IID_IShellLinkW, (LPVOID*)&shelllink))) - goto done; + if (!SUCCEEDED(CoCreateInstance( &CLSID_ShellLink, NULL, + CLSCTX_INPROC_SERVER, &IID_IShellLinkW, (LPVOID*)&shelllink))) + goto done; - IShellLinkW_SetPath( shelllink, cmdline ); - SHPathPrepareForWriteW( NULL, NULL, lnkpath, SHPPFW_DIRCREATE|SHPPFW_IGNOREFILENAME ); - if (SUCCEEDED(IShellLinkW_QueryInterface( shelllink, &IID_IPersistFile, (LPVOID*)&persistfile))) - { - TRACE( "writing link: %s\n", debugstr_w(lnkpath) ); - IPersistFile_Save( persistfile, lnkpath, FALSE ); - IPersistFile_Release( persistfile ); - } - IShellLinkW_Release( shelllink ); + IShellLinkW_SetPath( shelllink, cmdline ); + SHPathPrepareForWriteW( NULL, NULL, lnkpath, SHPPFW_DIRCREATE|SHPPFW_IGNOREFILENAME ); + if (SUCCEEDED(IShellLinkW_QueryInterface( shelllink, &IID_IPersistFile, (LPVOID*)&persistfile))) + { + TRACE( "writing link: %s\n", debugstr_w(lnkpath) ); + IPersistFile_Save( persistfile, lnkpath, FALSE ); + IPersistFile_Release( persistfile ); + } + IShellLinkW_Release( shelllink ); -done: - if (SUCCEEDED(initresult)) CoUninitialize(); - HeapFree( GetProcessHeap(), 0, cmdline ); + done: + if (SUCCEEDED(initresult)) CoUninitialize(); + HeapFree( GetProcessHeap(), 0, cmdline ); + } + return TRUE; } diff --git a/dlls/setupapi/tests/install.c b/dlls/setupapi/tests/install.c index 9be46fe..981dce3 100644 --- a/dlls/setupapi/tests/install.c +++ b/dlls/setupapi/tests/install.c @@ -393,7 +393,7 @@ static void test_profile_items(void) "[Version]\n" "Signature=\"$Chicago$\"\n" "[DefaultInstall]\n" - "ProfileItems=TestItem,TestItem2\n" + "ProfileItems=TestItem,TestItem2,TestGroup\n" "[TestItem]\n" "Name=TestItem\n" "CmdLine=11,,notepad.exe\n" @@ -401,6 +401,8 @@ static void test_profile_items(void) "Name=TestItem2\n" "CmdLine=11,,notepad.exe\n" "SubDir=TestDir\n" + "[TestGroup]\n" + "Name=TestGroup,4\n" ; hShell32 = LoadLibraryA("shell32"); @@ -432,6 +434,8 @@ static void test_profile_items(void) ok(INVALID_FILE_ATTRIBUTES != GetFileAttributes(path), "directory not created\n"); snprintf(path, MAX_PATH, "%s\\TestDir\\TestItem2.lnk", commonprogs); ok(INVALID_FILE_ATTRIBUTES != GetFileAttributes(path), "link not created\n"); + snprintf(path, MAX_PATH, "%s\\TestGroup", commonprogs); + ok(INVALID_FILE_ATTRIBUTES != GetFileAttributes(path), "group not created\n"); } snprintf(path, MAX_PATH, "%s\\TestItem.lnk", commonprogs); @@ -442,6 +446,8 @@ static void test_profile_items(void) DeleteFile(path); snprintf(path, MAX_PATH, "%s\\TestDir", commonprogs); RemoveDirectory(path); + snprintf(path, MAX_PATH, "%s\\TestGroup", commonprogs); + RemoveDirectory(path); cleanup: if (hShell32) FreeLibrary(hShell32); diff --git a/include/setupapi.h b/include/setupapi.h index cb680d2..353f9fd 100644 --- a/include/setupapi.h +++ b/include/setupapi.h @@ -807,6 +807,10 @@ typedef struct _SP_INF_INFORMATION { #define DELFLG_IN_USE 0x00000001 #define DELFLG_IN_USE1 0x00010000 +#define FLG_PROFITEM_CURRENTUSER 0x00000001 +#define FLG_PROFITEM_DELETE 0x00000002 +#define FLG_PROFITEM_GROUP 0x00000004 + typedef struct _FILEPATHS_A { PCSTR Target; -- 1.5.6.3