Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
b7fe5e0a
Commit
b7fe5e0a
authored
Nov 13, 2008
by
Vincent Povirk
Committed by
Alexandre Julliard
Nov 24, 2008
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
setupapi: Implement FLG_PROFITEM_GROUP.
parent
27335726
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
70 additions
and
49 deletions
+70
-49
install.c
dlls/setupapi/install.c
+58
-48
install.c
dlls/setupapi/tests/install.c
+7
-1
setupapi.h
include/setupapi.h
+5
-0
No files found.
dlls/setupapi/install.c
View file @
b7fe5e0a
...
...
@@ -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,80 @@ 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
);
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
);
if
(
lnkpath
+
MAX_PATH
<
lnkpath_end
+
5
)
return
TRUE
;
strcpyW
(
lnkpath_end
,
dotlnk
);
SetupGetStringFieldW
(
&
context
,
2
,
NULL
,
0
,
&
subdir_size
);
SetupGetStringFieldW
(
&
context
,
3
,
NULL
,
0
,
&
filename_size
);
TRACE
(
"link path: %s
\n
"
,
debugstr_w
(
lnkpath
)
);
if
(
dir_len
&&
filename_size
)
/* calculate command line */
if
(
SetupFindFirstLineW
(
hinf
,
field
,
CmdLine
,
&
context
))
{
cmdline
=
cmdline_end
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
WCHAR
)
*
(
dir_len
+
subdir_size
+
filename_size
+
1
)
);
unsigned
int
dir_len
=
0
,
subdir_size
=
0
,
filename_size
=
0
;
int
dirid
=
0
;
LPCWSTR
dir
;
LPWSTR
cmdline_end
;
strcpyW
(
cmdline_end
,
dir
);
cmdline_end
+=
dir_len
;
if
(
cmdline_end
[
-
1
]
!=
'\\'
)
*
cmdline_end
++
=
'\\'
;
SetupGetIntField
(
&
context
,
1
,
&
dirid
);
dir
=
DIRID_get_string
(
dirid
);
if
(
subdir_size
)
if
(
dir
)
dir_len
=
strlenW
(
dir
);
SetupGetStringFieldW
(
&
context
,
2
,
NULL
,
0
,
&
subdir_size
);
SetupGetStringFieldW
(
&
context
,
3
,
NULL
,
0
,
&
filename_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_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
);
}
IShellLinkW_Release
(
shelllink
);
done:
if
(
SUCCEEDED
(
initresult
))
CoUninitialize
();
HeapFree
(
GetProcessHeap
(),
0
,
cmdline
);
return
TRUE
;
}
...
...
dlls/setupapi/tests/install.c
View file @
b7fe5e0a
...
...
@@ -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
);
...
...
include/setupapi.h
View file @
b7fe5e0a
...
...
@@ -1054,6 +1054,11 @@ DECL_WINELIB_SETUPAPI_TYPE_AW(PSP_INF_SIGNER_INFO)
#define FLG_REGSVR_DLLREGISTER 0x00000001
#define FLG_REGSVR_DLLINSTALL 0x00000002
#define FLG_PROFITEM_CURRENTUSER 0x00000001
#define FLG_PROFITEM_DELETE 0x00000002
#define FLG_PROFITEM_GROUP 0x00000004
#define FLG_PROFITEM_CSIDL 0x00000008
#define DI_NOVCP 0x00000008
/* Class installer function codes */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment