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
13d74c5f
Commit
13d74c5f
authored
Jun 13, 2000
by
Juergen Schmied
Committed by
Alexandre Julliard
Jun 13, 2000
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
- new dll shfolder.dll
- small fixes
parent
661a9403
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
415 additions
and
201 deletions
+415
-201
Makefile.in
dlls/Makefile.in
+2
-1
Makefile.in
dlls/shell32/Makefile.in
+3
-2
shell32.spec
dlls/shell32/shell32.spec
+107
-88
shellord.c
dlls/shell32/shellord.c
+22
-9
shellpath.c
dlls/shell32/shellpath.c
+206
-59
shellstring.c
dlls/shell32/shellstring.c
+1
-1
shfolder.spec
dlls/shell32/shfolder.spec
+6
-0
shlwapi.spec
dlls/shell32/shlwapi.spec
+2
-2
shell.h
include/shell.h
+0
-35
shlobj.h
include/shlobj.h
+58
-1
shlwapi.h
include/shlwapi.h
+4
-0
undocshell.h
include/wine/undocshell.h
+3
-3
loadorder.c
loader/loadorder.c
+1
-0
No files found.
dlls/Makefile.in
View file @
13d74c5f
...
...
@@ -97,6 +97,7 @@ EXTRADLLNAMES = \
olesvr
\
rasapi16
\
shell
\
shfolder
\
shlwapi
\
storage
\
system
\
...
...
@@ -286,7 +287,7 @@ libriched32.@LIBEXT@: richedit/libriched32.@LIBEXT@
libsetupx.@LIBEXT@
:
setupx/libsetupx.@LIBEXT@
$(RM)
$@
&&
$(LN_S)
setupx/libsetupx.@LIBEXT@
$@
libshell32.@LIBEXT@ libshell.@LIBEXT@ libshlwapi.@LIBEXT@
:
shell32/libshell32.@LIBEXT@
libshell32.@LIBEXT@ libshell.@LIBEXT@ libshlwapi.@LIBEXT@
libshfolder.@LIBEXT@
:
shell32/libshell32.@LIBEXT@
$(RM)
$@
&&
$(LN_S)
shell32/libshell32.@LIBEXT@
$@
libsound.@LIBEXT@
:
sound/libsound.@LIBEXT@
...
...
dlls/shell32/Makefile.in
View file @
13d74c5f
...
...
@@ -4,13 +4,14 @@ SRCDIR = @srcdir@
VPATH
=
@srcdir@
MODULE
=
shell32
SOVERSION
=
1.0
ALTNAMES
=
shell shlwapi
ALTNAMES
=
shell shlwapi
shfolder
IMPORTS
=
ole32
SPEC_SRCS
=
\
shell.spec
\
shell32.spec
\
shlwapi.spec
shlwapi.spec
\
shfolder.spec
C_SRCS
=
\
brsfolder.c
\
...
...
dlls/shell32/shell32.spec
View file @
13d74c5f
...
...
@@ -20,13 +20,10 @@ import ole32.dll
5 stub SHChangeNotifyUpdateEntryList@16
6 stub CheckEscapesW@8
7 stdcall CommandLineToArgvW(wstr ptr) CommandLineToArgvW
8 stdcall Control_FillCache_RunDLL (long long long long) Control_FillCache_RunDLL
9 stub PifMgr_OpenProperties@16
10 stub PifMgr_GetProperties@20
11 stub PifMgr_SetProperties@20
12 stub Control_FillCache_RunDLLA@16
13 stub PifMgr_CloseProperties@8
14 stub Control_FillCache_RunDLLW@16
15 stdcall ILGetDisplayName(ptr ptr) ILGetDisplayName
16 stdcall ILFindLastID(ptr) ILFindLastID
17 stdcall ILRemoveLastID(ptr) ILRemoveLastID
...
...
@@ -34,7 +31,6 @@ import ole32.dll
19 stdcall ILCloneFirst (ptr) ILCloneFirst
20 stdcall ILGlobalClone (ptr) ILGlobalClone
21 stdcall ILIsEqual (ptr ptr) ILIsEqual
22 stdcall Control_RunDLL(long long long long) Control_RunDLL # exported by name
23 stdcall ILIsParent (long long long) ILIsParent
24 stdcall ILFindChild (long long) ILFindChild
25 stdcall ILCombine(ptr ptr) ILCombine
...
...
@@ -53,8 +49,6 @@ import ole32.dll
38 stdcall PathStripPath(ptr)PathStripPathAW
39 stdcall PathIsUNC (ptr) PathIsUNCAW
40 stdcall PathIsRelative (ptr) PathIsRelativeAW
41 stub Control_RunDLLA@16
42 stub Control_RunDLLW@16
43 stdcall PathIsExe (ptr) PathIsExeAW
44 stub DoEnvironmentSubstA@8
45 stdcall PathFileExists(ptr) PathFileExistsAW
...
...
@@ -113,7 +107,6 @@ import ole32.dll
98 stdcall SHGetRealIDL (long long long) SHGetRealIDL
99 stdcall SetAppStartingCursor (long long) SetAppStartingCursor
100 stdcall SHRestricted(long) SHRestricted
101 stub DragQueryFileAorW # exported by name
102 stdcall SHCoCreateInstance(ptr ptr long ptr ptr) SHCoCreateInstance
103 stdcall SignalFileOpen(long) SignalFileOpen
104 stdcall FileMenu_DeleteAllItems(long)FileMenu_DeleteAllItems
...
...
@@ -150,7 +143,6 @@ import ole32.dll
135 stdcall DragQueryPoint(long ptr) DragQueryPoint
136 stdcall DAD_SetDragImage(long long) DAD_SetDragImage
137 stdcall DAD_ShowDragImage (long) DAD_ShowDragImage
138 stub DuplicateIcon # exported by name
139 stub Desktop_UpdateBriefcaseOnEvent
140 stdcall FileMenu_DeleteItemByIndex(long long) FileMenu_DeleteItemByIndex
141 stdcall FileMenu_DeleteItemByFirstID(long long)FileMenu_DeleteItemByFirstID
...
...
@@ -217,48 +209,13 @@ import ole32.dll
213 stub Printers_RegisterWindowW
214 stub Printers_UnregisterWindow
215 stub SHStartNetConnectionDialog@12
216 stub ExtractVersionResource16W # exported by name
217 stub FindExeDlgProc # exported by name
218 stdcall FindExecutableA(ptr ptr ptr) FindExecutableA # exported by name
219 stdcall FindExecutableW(wstr wstr wstr) FindExecutableW # exported by name
220 stdcall FreeIconList(long) FreeIconList # exported by name
221 stub InternalExtractIconListA # exported by name
222 stub InternalExtractIconListW # exported by name
223 stub OpenAs_RunDLL # exported by name
224 stub OpenAs_RunDLLA # exported by name
225 stub OpenAs_RunDLLW # exported by name
226 stub PrintersGetCommand_RunDLL # exported by name
227 stub PrintersGetCommand_RunDLLA # exported by name
228 stub PrintersGetCommand_RunDLLW # exported by name
229 stub RealShellExecuteA # exported by name
230 stub RealShellExecuteExA # exported by name
231 stub RealShellExecuteExW # exported by name
232 stub RealShellExecuteW # exported by name
233 stub RegenerateUserEnvironment # exported by name
234 stdcall SHAddToRecentDocs (long ptr) SHAddToRecentDocs # exported by name
235 stdcall SHAppBarMessage(long ptr) SHAppBarMessage # exported by name
236 stdcall SHBrowseForFolder(ptr) SHBrowseForFolderA # exported by name
237 stdcall SHBrowseForFolderA(ptr) SHBrowseForFolderA # exported by name
238 stub SHBrowseForFolderW@4 # exported by name
239 stdcall SHChangeNotify (long long ptr ptr) SHChangeNotifyAW # exported by name
240 stub SHEmptyRecycleBinA@12 # exported by name
241 stub SHEmptyRecycleBinW@12 # exported by name
243 stdcall shell32_243(long long) shell32_243
244 stdcall SHInitRestricted(ptr ptr) SHInitRestricted # win98+ only, by ordinal
245 stub SHFormatDrive@16 # exported by name
246 stub SHFreeNameMappings@4 # exported by name
244 stdcall SHInitRestricted(ptr ptr) SHInitRestricted
247 stdcall SHGetDataFromIDListA (ptr ptr long ptr long) SHGetDataFromIDListA
248 stdcall SHGetDataFromIDListW (ptr ptr long ptr long) SHGetDataFromIDListW
249 stdcall PathParseIconLocation (ptr) PathParseIconLocationAW
250 stdcall PathRemoveExtension (ptr) PathRemoveExtensionAW
251 stdcall PathRemoveArgs (ptr) PathRemoveArgsAW
264 stdcall SHHelpShortcuts_RunDLL(long long long long) SHHelpShortcuts_RunDLL # exported by name
265 stub SHHelpShortcuts_RunDLLA@16 # exported by name
266 stub SHHelpShortcuts_RunDLLW@16 # exported by name
267 stdcall SHLoadInProc(long) SHLoadInProc # exported by name
268 stub SHQueryRecycleBinA@8 # exported by name
269 stub SHQueryRecycleBinW@8 # exported by name
270 stub SHUpdateRecycleBinIcon@0 # exported by name
271 stub SheChangeDirA
272 stub SheChangeDirExA
273 stub SheChangeDirExW
...
...
@@ -283,7 +240,6 @@ import ole32.dll
292 stdcall ShellExecuteExA (long) ShellExecuteExA
293 stdcall ShellExecuteExW (long) ShellExecuteExW
294 stdcall ShellExecuteW (long wstr wstr wstr wstr long) ShellExecuteW
295 stub ShellHookProc # exported by name
296 stdcall Shell_NotifyIcon(long ptr) Shell_NotifyIcon
297 stdcall Shell_NotifyIconA(long ptr) Shell_NotifyIconA
298 stdcall Shell_NotifyIconW(long ptr) Shell_NotifyIconW
...
...
@@ -317,7 +273,6 @@ import ole32.dll
326 stdcall StrStrIA(str str)StrStrIA
327 stdcall StrStrIW(wstr wstr)StrStrIW
328 stdcall StrStrW(wstr wstr)StrStrW
329 stub WOWShellExecute # proper ordinal unknown
505 stdcall SHRegCloseKey (long) SHRegCloseKey
506 stdcall SHRegOpenKeyA (long str long) SHRegOpenKeyA
...
...
@@ -348,58 +303,122 @@ import ole32.dll
650 stdcall PathIsSameRoot(ptr ptr)PathIsSameRootAW
# nt40/win98
651 stdcall ReadCabinetState (long long) ReadCabinetState
651 stdcall ReadCabinetState (long long) ReadCabinetState
# OldReadCabinetState
652 stdcall WriteCabinetState (long) WriteCabinetState
653 stdcall PathProcessCommand (long long long long) PathProcessCommandAW
# win98
654 stdcall shell32_654 (long long) shell32_654
660 stdcall FileIconInit (long) FileIconInit
680 stdcall IsUserAdmin () IsUserAdmin
654 stdcall shell32_654(long long)shell32_654 # ReadCabinetState@8
660 stdcall FileIconInit(long)FileIconInit
680 stdcall IsUserAdmin()IsUserAdmin
# >= NT5
714 stdcall SHELL32_714(ptr)SHELL32_714
@ stdcall SHGetFolderLocation(long long long long ptr)SHGetFolderLocation
714 stdcall SHELL32_714(ptr)SHELL32_714 # PathIsTemporaryW
1217 stub FOOBAR1217 # no joke! This is the real name!!
# later additions ... FIXME: incorrect ordinals
# win 98 uses 2...330, 505..511, 520..526, 640..654, 660, 680, 700..707, 711
#
# version 4.0 (win95)
# _WIN32_IE >= 0x0200
#
@ stdcall Control_FillCache_RunDLL(long long long long)Control_FillCache_RunDLL
@ stub Control_FillCache_RunDLLA@16
@ stub Control_FillCache_RunDLLW@16
@ stdcall Control_RunDLL(long long long long)Control_RunDLL
@ stub Control_RunDLLA@16
@ stub Control_RunDLLW@16
@ stdcall DllInstall(long wstr)SHELL32_DllInstall
@ stdcall DoEnvironmentSubstA(str str)DoEnvironmentSubstA
@ stdcall DoEnvironmentSubstW(wstr wstr)DoEnvironmentSubstW
@ stub DragQueryFileAorW
@ stub DuplicateIcon
@ stdcall ExtractAssociatedIconA(long ptr long)ExtractAssociatedIconA
@ stub ExtractAssociatedIconExA
@ stub ExtractAssociatedIconExW
@ stub ExtractAssociatedIconW
@ stdcall ExtractIconA(long str long)ExtractIconA
@ stdcall ExtractIconEx(ptr long ptr ptr long)ExtractIconExAW
@ stdcall ExtractIconExA(str long ptr ptr long)ExtractIconExA
@ stdcall ExtractIconExW(wstr long ptr ptr long)ExtractIconExW
@ stdcall ExtractIconW(long wstr long)ExtractIconW
@ stub ExtractIconResInfoA
@ stub ExtractIconResInfoW
@ stub ExtractVersionResource16W
@ stub FindExeDlgProc
@ stdcall FindExecutableA(ptr ptr ptr) FindExecutableA
@ stdcall FindExecutableW(wstr wstr wstr) FindExecutableW
@ stdcall FreeIconList(long) FreeIconList
@ stub InternalExtractIconListA
@ stub InternalExtractIconListW
@ stub OpenAs_RunDLL
@ stub OpenAs_RunDLLA
@ stub OpenAs_RunDLLW
@ stub PrintersGetCommand_RunDLL
@ stub PrintersGetCommand_RunDLLA
@ stub PrintersGetCommand_RunDLLW
@ stub RealShellExecuteA
@ stub RealShellExecuteExA
@ stub RealShellExecuteExW
@ stub RealShellExecuteW
@ stub RegenerateUserEnvironment
@ stdcall SHAddToRecentDocs (long ptr) SHAddToRecentDocs
@ stdcall SHAppBarMessage(long ptr) SHAppBarMessage
@ stdcall SHBrowseForFolder(ptr) SHBrowseForFolderA
@ stdcall SHBrowseForFolderA(ptr) SHBrowseForFolderA
@ stub SHBrowseForFolderW@4
@ stdcall SHChangeNotify (long long ptr ptr) SHChangeNotifyAW
@ stub ShellHookProc
@ stub SHEmptyRecycleBinA@12
@ stub SHEmptyRecycleBinW@12
@ stdcall SHFileOperation(ptr)SHFileOperationAW
@ stdcall SHFileOperationA(ptr)SHFileOperationA
@ stdcall SHFileOperationW(ptr)SHFileOperationW
@ stub SHFormatDrive@16
@ stub SHFreeNameMappings@4
@ stdcall SHGetDesktopFolder(ptr)SHGetDesktopFolder
@ stdcall SHGetFileInfo(ptr long ptr long long)SHGetFileInfoAW
@ stdcall SHGetFileInfoA(ptr long ptr long long)SHGetFileInfoA
@ stdcall SHGetFileInfoW(ptr long ptr long long)SHGetFileInfoW
@ stdcall SHGetInstanceExplorer(long)SHGetInstanceExplorer
@ stdcall SHGetMalloc(ptr)SHGetMalloc
@ stub SHGetNewLinkInfo@20
@ stdcall SHGetPathFromIDList(ptr ptr)SHGetPathFromIDListAW
@ stdcall SHGetPathFromIDListA(long long)SHGetPathFromIDListA
@ stdcall SHGetPathFromIDListW(long long)SHGetPathFromIDListW
@ stdcall SHGetSpecialFolderLocation(long long ptr)SHGetSpecialFolderLocation
@ stdcall SHHelpShortcuts_RunDLL(long long long long) SHHelpShortcuts_RunDLL
@ stub SHHelpShortcuts_RunDLLA@16
@ stub SHHelpShortcuts_RunDLLW@16
@ stdcall SHLoadInProc(long) SHLoadInProc
@ stub SHQueryRecycleBinA@8
@ stub SHQueryRecycleBinW@8
@ stub SHUpdateRecycleBinIcon@0
@ stub WOWShellExecute@28
1220 stdcall DllGetVersion (ptr) SHELL32_DllGetVersion # win98:201
1221 stdcall SHGetSpecialFolderPathA(long ptr long long) SHGetSpecialFolderPathA # win98:292
1222 stdcall DoEnvironmentSubstA (str str) DoEnvironmentSubstA # win98:293
1223 stdcall DoEnvironmentSubstW (wstr wstr) DoEnvironmentSubstW # win98:204
#
# version 4.70 (IE3.0)
# _WIN32_IE >= 0x0300
#
# by-name routines
#
# version 4.71 (IE4.0)
# _WIN32_IE >= 0x0400
#
@ stub DllCanUnloadNow
@ stdcall DllGetVersion(ptr)SHELL32_DllGetVersion
@ stub SHGetFreeDiskSpace
@ stdcall SHGetSpecialFolderPathA(long ptr long long) SHGetSpecialFolderPathA
@ stdcall DllInstall (long wstr) SHELL32_DllInstall
#
# version 4.72 (IE4.01)
# _WIN32_IE >= 0x0401
# no new exports
#
@ stdcall ExtractAssociatedIconA(long ptr long) ExtractAssociatedIconA # exported by name
@ stub ExtractAssociatedIconExA # exported by name
@ stub ExtractAssociatedIconExW # exported by name
@ stub ExtractAssociatedIconW # exported by name
@ stdcall ExtractIconA(long str long) ExtractIconA # exported by name
@ stdcall ExtractIconEx(ptr long ptr ptr long) ExtractIconExAW
@ stdcall ExtractIconExA(str long ptr ptr long) ExtractIconExA
@ stdcall ExtractIconExW(wstr long ptr ptr long) ExtractIconExW
@ stdcall ExtractIconW(long wstr long) ExtractIconW # exported by name
@ stub ExtractIconResInfoA # exported by name
@ stub ExtractIconResInfoW # exported by name
@ stdcall SHFileOperation (ptr) SHFileOperationAW
@ stdcall SHFileOperationA (ptr) SHFileOperationA
@ stdcall SHFileOperationW (ptr) SHFileOperationW
@ stdcall SHGetDesktopFolder(ptr) SHGetDesktopFolder
@ stdcall SHGetFileInfo(ptr long ptr long long) SHGetFileInfoAW
@ stdcall SHGetFileInfoA(ptr long ptr long long) SHGetFileInfoA
@ stdcall SHGetFileInfoW(ptr long ptr long long) SHGetFileInfoW
@ stdcall SHGetInstanceExplorer (long) SHGetInstanceExplorer
@ stdcall SHGetMalloc(ptr) SHGetMalloc
@ stub SHGetNewLinkInfo@20
@ stdcall SHGetPathFromIDList(ptr ptr) SHGetPathFromIDListAW
@ stdcall SHGetPathFromIDListA (long long) SHGetPathFromIDListA
@ stdcall SHGetPathFromIDListW (long long) SHGetPathFromIDListW
@ stdcall SHGetSpecialFolderLocation(long long ptr) SHGetSpecialFolderLocation # exported by name
#
# version 5.00 (Win2K)
# _WIN32_IE >= 0x0500
#
@ stdcall SHGetFolderPathA(long long long long ptr)SHGetFolderPathA
@ stdcall SHGetFolderPathW(long long long long ptr)SHGetFolderPathW
@ stdcall SHGetFolderLocation(long long long long ptr)SHGetFolderLocation
dlls/shell32/shellord.c
View file @
13d74c5f
...
...
@@ -1069,9 +1069,12 @@ DWORD WINAPI SHLWAPI_193 ()
/*************************************************************************
* SHLWAPI_219 [SHLWAPI]
*
* NOTES
* error codes: E_POINTER, E_NOINTERFACE
*/
HRESULT
WINAPI
SHLWAPI_219
(
LPVOID
w
,
/* returned by LocalAlloc */
LPVOID
w
,
/* returned by LocalAlloc
, 0x450 bytes, iface
*/
LPVOID
x
,
LPVOID
y
,
LPWSTR
z
)
/* OUT: path */
...
...
@@ -1100,26 +1103,36 @@ HANDLE WINAPI SHLWAPI_222 (LPCLSID guid)
* SHLWAPI_223 [SHLWAPI]
*
* NOTES
*
function guessed
*/
*
get the count of the semaphore
*/
DWORD
WINAPI
SHLWAPI_223
(
HANDLE
handle
)
{
DWORD
oldCount
;
FIXME
(
"(0x%08x) stub
\n
"
,
handle
);
ReleaseSemaphore
(
handle
,
1
,
&
oldCount
);
WaitForSingleObject
(
handle
,
0
);
return
0
;
ReleaseSemaphore
(
handle
,
1
,
&
oldCount
);
/* +1 */
WaitForSingleObject
(
handle
,
0
);
/* -1 */
return
oldCount
;
}
/*************************************************************************
* SHLWAPI_237 [SHLWAPI]
*
* NOTES
* checks if a class is registered, if not it registers it
*/
DWORD
WINAPI
SHLWAPI_237
(
LPVOID
x
)
DWORD
WINAPI
SHLWAPI_237
(
WNDCLASSW
*
lpWndClass
)
{
FIXME
(
"(ptr=%p str=%s wstr=%s)
\n
"
,
x
,
debugstr_a
(
x
),
debugstr_w
(
x
));
return
0xabba1234
;
WNDCLASSW
WndClass
;
TRACE
(
"(0x%08x %s)
\n
"
,
lpWndClass
->
hInstance
,
debugstr_w
(
lpWndClass
->
lpszClassName
));
if
(
!
GetClassInfoW
(
lpWndClass
->
hInstance
,
lpWndClass
->
lpszClassName
,
&
WndClass
))
{
return
RegisterClassW
(
lpWndClass
);
}
return
TRUE
;
}
/*************************************************************************
...
...
dlls/shell32/shellpath.c
View file @
13d74c5f
...
...
@@ -417,7 +417,6 @@ LPSTR WINAPI PathGetArgsA(LPCSTR lpszPath)
lpszPath
++
;
}
return
(
LPSTR
)
lpszPath
;
}
/*************************************************************************
...
...
@@ -571,7 +570,7 @@ void WINAPI PathStripPathA(LPSTR lpszPath)
TRACE
(
"%s
\n
"
,
lpszPath
);
if
(
lpszFileName
)
RtlMoveMemory
(
lpszPath
,
lpszFileName
,
strlen
(
lpszFileName
));
RtlMoveMemory
(
lpszPath
,
lpszFileName
,
strlen
(
lpszFileName
)
+
1
);
}
/*************************************************************************
...
...
@@ -583,7 +582,7 @@ void WINAPI PathStripPathW(LPWSTR lpszPath)
TRACE
(
"%s
\n
"
,
debugstr_w
(
lpszPath
));
if
(
lpszFileName
)
RtlMoveMemory
(
lpszPath
,
lpszFileName
,
lstrlenW
(
lpszFileName
)
*
sizeof
(
WCHAR
));
RtlMoveMemory
(
lpszPath
,
lpszFileName
,
(
lstrlenW
(
lpszFileName
)
+
1
)
*
sizeof
(
WCHAR
));
}
/*************************************************************************
...
...
@@ -604,20 +603,18 @@ BOOL WINAPI PathStripToRootA(LPSTR lpszPath)
TRACE
(
"%s
\n
"
,
lpszPath
);
/* X:\ */
if
(
lpszPath
[
1
]
==
':'
&&
lpszPath
[
2
]
==
'\\'
)
{
lpszPath
[
3
]
=
'\0'
;
return
TRUE
;
}
/* "\" */
if
(
lpszPath
[
0
]
==
'\\'
)
if
(
lpszPath
[
1
]
==
':'
)
{
lpszPath
[
1
]
=
'\0'
;
return
TRUE
;
if
(
lpszPath
[
2
]
==
'\\'
)
{
lpszPath
[
3
]
=
'\0'
;
return
TRUE
;
}
lpszPath
[
2
]
=
'\0'
;
return
FALSE
;
}
/* UNC "\\<computer>\<share>" */
/* UNC "\\<computer>\<share>"
FIXME: not complete
*/
if
(
lpszPath
[
0
]
==
'\\'
&&
lpszPath
[
1
]
==
'\\'
)
{
int
foundbackslash
=
0
;
...
...
@@ -634,6 +631,14 @@ BOOL WINAPI PathStripToRootA(LPSTR lpszPath)
}
}
/* "\" */
if
(
lpszPath
[
0
]
==
'\\'
)
{
lpszPath
[
1
]
=
'\0'
;
return
TRUE
;
}
lpszPath
[
0
]
=
'\0'
;
return
FALSE
;
}
...
...
@@ -645,18 +650,17 @@ BOOL WINAPI PathStripToRootW(LPWSTR lpszPath)
TRACE
(
"%s
\n
"
,
debugstr_w
(
lpszPath
));
/* X:\ */
if
(
lpszPath
[
1
]
==
':'
&&
lpszPath
[
2
]
==
'\\'
)
if
(
lpszPath
[
1
]
==
':'
)
{
lpszPath
[
3
]
=
'\0'
;
return
TRUE
;
if
(
lpszPath
[
2
]
==
'\\'
)
{
lpszPath
[
3
]
=
'\0'
;
return
TRUE
;
}
lpszPath
[
2
]
=
'\0'
;
return
FALSE
;
}
/* "\" */
if
(
lpszPath
[
0
]
==
'\\'
)
{
lpszPath
[
1
]
=
'\0'
;
return
TRUE
;
}
/* UNC "\\<computer>\<share>" */
if
(
lpszPath
[
0
]
==
'\\'
&&
lpszPath
[
1
]
==
'\\'
)
...
...
@@ -675,6 +679,14 @@ BOOL WINAPI PathStripToRootW(LPWSTR lpszPath)
}
}
/* "\" */
if
(
lpszPath
[
0
]
==
'\\'
)
{
lpszPath
[
1
]
=
'\0'
;
return
TRUE
;
}
lpszPath
[
0
]
=
(
WCHAR
)
'\0'
;
return
FALSE
;
}
...
...
@@ -690,32 +702,54 @@ BOOL WINAPI PathStripToRootAW(LPVOID lpszPath)
/*************************************************************************
* PathRemoveArgsA [SHLWAPI.@]
*
* NOTES
* returns pointer to last character, not void
*/
void
WINAPI
PathRemoveArgsA
(
LPSTR
lpszPath
)
LPSTR
WINAPI
PathRemoveArgsA
(
LPSTR
lpszPath
)
{
LPSTR
lpszArgs
=
PathGetArgsA
(
lpszPath
);
TRACE
(
"%s
\n
"
,
lpszPath
);
BOOL
qflag
=
FALSE
;
LPSTR
pPos
=
lpszPath
;
TRACE
(
"%s
\n
"
,
lpszPath
);
if
(
lpszArgs
)
*
(
--
lpszArgs
)
=
'\0'
;
while
(
*
lpszPath
)
{
if
(
!
qflag
&&
*
lpszPath
==
' '
)
break
;
if
(
*
lpszPath
==
'"'
)
qflag
=!
qflag
;
lpszPath
++
;
if
(
*
lpszPath
)
pPos
++
;
};
*
lpszPath
=
'\0'
;
return
pPos
;
}
/*************************************************************************
* PathRemoveArgsW [SHLWAPI.@]
*/
void
WINAPI
PathRemoveArgsW
(
LPWSTR
lpszPath
)
LPWSTR
WINAPI
PathRemoveArgsW
(
LPWSTR
lpszPath
)
{
LPWSTR
lpszArgs
=
PathGetArgsW
(
lpszPath
);
BOOL
qflag
=
FALSE
;
LPWSTR
pPos
=
lpszPath
;
TRACE
(
"%s
\n
"
,
debugstr_w
(
lpszPath
));
if
(
lpszArgs
)
*
(
--
lpszArgs
)
=
'\0'
;
while
(
*
lpszPath
)
{
if
(
!
qflag
&&
*
lpszPath
==
(
WCHAR
)
' '
)
break
;
if
(
*
lpszPath
==
(
WCHAR
)
'"'
)
qflag
=!
qflag
;
lpszPath
++
;
if
(
*
lpszPath
)
pPos
++
;
};
*
lpszPath
=
(
WCHAR
)
'\0'
;
return
pPos
;
}
/*************************************************************************
* PathRemoveArgsAW [SHELL32.251]
*/
void
WINAPI
PathRemoveArgsAW
(
LPVOID
lpszPath
)
LPVOID
WINAPI
PathRemoveArgsAW
(
LPVOID
lpszPath
)
{
if
(
VERSION_OsIsUnicode
())
return
PathRemoveArgsW
(
lpszPath
);
...
...
@@ -764,6 +798,8 @@ void WINAPI PathRemoveExtensionAW(LPVOID lpszPath)
* Otherwise
* the address of the last character is returned.
*
* FIXME
* "c:\": keep backslash
*/
LPSTR
WINAPI
PathRemoveBackslashA
(
LPSTR
lpszPath
)
{
...
...
@@ -878,27 +914,48 @@ LPVOID WINAPI PathRemoveBlanksAW(LPVOID str)
/*************************************************************************
* PathQuoteSpacesA [SHLWAPI.@]
*
* NOTES
*/
LPSTR
WINAPI
PathQuoteSpacesA
(
LP
C
STR
lpszPath
)
LPSTR
WINAPI
PathQuoteSpacesA
(
LPSTR
lpszPath
)
{
FIXME
(
"%s
\n
"
,
lpszPath
);
TRACE
(
"%s
\n
"
,
lpszPath
);
if
(
StrChrA
(
lpszPath
,
' '
))
{
int
len
=
strlen
(
lpszPath
);
RtlMoveMemory
(
lpszPath
+
1
,
lpszPath
,
len
);
*
(
lpszPath
++
)
=
'"'
;
lpszPath
+=
len
;
*
(
lpszPath
++
)
=
'"'
;
*
(
lpszPath
)
=
'\0'
;
return
--
lpszPath
;
}
return
0
;
}
/*************************************************************************
* PathQuoteSpacesW [SHLWAPI.@]
*/
LPWSTR
WINAPI
PathQuoteSpacesW
(
LP
C
WSTR
lpszPath
)
LPWSTR
WINAPI
PathQuoteSpacesW
(
LPWSTR
lpszPath
)
{
FIXME
(
"%s
\n
"
,
debugstr_w
(
lpszPath
));
return
0
;
TRACE
(
"%s
\n
"
,
debugstr_w
(
lpszPath
));
if
(
StrChrW
(
lpszPath
,
' '
))
{
int
len
=
lstrlenW
(
lpszPath
);
RtlMoveMemory
(
lpszPath
+
1
,
lpszPath
,
len
*
sizeof
(
WCHAR
));
*
(
lpszPath
++
)
=
'"'
;
lpszPath
+=
len
;
*
(
lpszPath
++
)
=
'"'
;
*
(
lpszPath
)
=
'\0'
;
return
--
lpszPath
;
}
return
0
;
}
/*************************************************************************
* PathQuoteSpacesAW [SHELL32.55]
*/
LPVOID
WINAPI
PathQuoteSpacesAW
(
LP
C
VOID
lpszPath
)
LPVOID
WINAPI
PathQuoteSpacesAW
(
LPVOID
lpszPath
)
{
if
(
VERSION_OsIsUnicode
())
return
PathQuoteSpacesW
(
lpszPath
);
...
...
@@ -969,6 +1026,8 @@ int WINAPI PathParseIconLocationA(LPSTR lpszPath)
lpstrComma
[
0
]
=
'\0'
;
/* return atoi(&lpstrComma[1]); FIXME */
}
PathUnquoteSpacesA
(
lpszPath
);
return
0
;
}
...
...
@@ -986,6 +1045,7 @@ int WINAPI PathParseIconLocationW(LPWSTR lpszPath)
lpstrComma
[
0
]
=
'\0'
;
/* return _wtoi(&lpstrComma[1]); FIXME */
}
PathUnquoteSpacesW
(
lpszPath
);
return
0
;
}
...
...
@@ -1092,7 +1152,7 @@ BOOL WINAPI PathIsRootA(LPCSTR lpszPath)
{
if
(
*
(
lpszPath
++
)
==
'\\'
)
foundbackslash
++
;
}
if
(
foundbackslash
==
1
)
if
(
foundbackslash
<=
1
)
return
TRUE
;
}
return
FALSE
;
...
...
@@ -1122,7 +1182,7 @@ BOOL WINAPI PathIsRootW(LPCWSTR lpszPath)
{
if
(
*
(
lpszPath
++
)
==
'\\'
)
foundbackslash
++
;
}
if
(
foundbackslash
==
1
)
if
(
foundbackslash
<=
1
)
return
TRUE
;
}
return
FALSE
;
...
...
@@ -1480,7 +1540,7 @@ BOOL WINAPI PathIsURLA(LPCSTR lpstrPath)
while
(
SupportedProtocol
[
i
])
{
if
(
iSize
==
strlen
(
SupportedProtocol
[
i
]))
if
(
!
strncasecmp
(
lpstrPath
,
SupportedProtocol
[
i
],
iSize
))
;
if
(
!
strncasecmp
(
lpstrPath
,
SupportedProtocol
[
i
],
iSize
))
return
TRUE
;
i
++
;
}
...
...
@@ -1510,7 +1570,7 @@ BOOL WINAPI PathIsURLW(LPCWSTR lpstrPath)
while
(
SupportedProtocol
[
i
])
{
if
(
iSize
==
strlenW
(
SupportedProtocol
[
i
]))
if
(
!
strncmpiW
(
lpstrPath
,
SupportedProtocol
[
i
],
iSize
))
;
if
(
!
strncmpiW
(
lpstrPath
,
SupportedProtocol
[
i
],
iSize
))
return
TRUE
;
i
++
;
}
...
...
@@ -1987,11 +2047,21 @@ BOOL WINAPI SHGetSpecialFolderPathA (
}
RegCloseKey
(
hKey
);
if
(
bCreate
&&
CreateDirectoryA
(
szPath
,
NULL
))
/* if we don't care about existing directorys we are ready */
if
(
csidl
&
CSIDL_FLAG_DONT_VERIFY
)
return
TRUE
;
if
(
PathFileExistsA
(
szPath
))
return
TRUE
;
/* not existing but we not allowed to create it */
if
(
!
bCreate
)
return
FALSE
;
if
(
!
CreateDirectoryA
(
szPath
,
NULL
))
{
MESSAGE
(
"Created not existing system directory '%s'
\n
"
,
szPath
);
ERR
(
"Failed to create directory '%s'.
\n
"
,
szPath
);
return
FALSE
;
}
MESSAGE
(
"Created not existing system directory '%s'
\n
"
,
szPath
);
return
TRUE
;
}
...
...
@@ -2032,6 +2102,40 @@ BOOL WINAPI SHGetSpecialFolderPathAW (
}
/*************************************************************************
* SHGetFolderPathA [SHFOLDER.@]
*/
HRESULT
SHGetFolderPathA
(
HWND
hwndOwner
,
int
nFolder
,
HANDLE
hToken
,
/* FIXME: get paths for specific user */
DWORD
dwFlags
,
/* FIXME: SHGFP_TYPE_CURRENT|SHGFP_TYPE_DEFAULT */
LPSTR
pszPath
)
{
return
(
SHGetSpecialFolderPathA
(
hwndOwner
,
pszPath
,
CSIDL_FOLDER_MASK
&
nFolder
,
CSIDL_FLAG_CREATE
&
nFolder
))
?
S_OK
:
E_FAIL
;
}
/*************************************************************************
* SHGetFolderPathW [SHFOLDER.@]
*/
HRESULT
SHGetFolderPathW
(
HWND
hwndOwner
,
int
nFolder
,
HANDLE
hToken
,
DWORD
dwFlags
,
LPWSTR
pszPath
)
{
return
(
SHGetSpecialFolderPathW
(
hwndOwner
,
pszPath
,
CSIDL_FOLDER_MASK
&
nFolder
,
CSIDL_FLAG_CREATE
&
nFolder
))
?
S_OK
:
E_FAIL
;
}
/*************************************************************************
* PathCanonicalizeA
*
* FIXME
...
...
@@ -2178,16 +2282,30 @@ BOOL WINAPI PathCanonicalizeW(LPWSTR pszBuf, LPCWSTR pszPath)
/*************************************************************************
* PathFindNextComponentA
*
* Windows returns a pointer NULL (BO 000605)
*/
* NOTES
* special cases:
* "" null
* aa "" (pointer to traling NULL)
* aa\ "" (pointer to traling NULL)
* aa\\ "" (pointer to traling NULL)
* aa\\bb bb
* aa\\\bb \bb
* c:\aa\ "aa\"
* \\aa aa
* \\aa\b aa\b
*/
LPSTR
WINAPI
PathFindNextComponentA
(
LPCSTR
pszPath
)
{
while
(
*
pszPath
)
{
if
(
*
pszPath
++==
'\\'
)
return
(
LPSTR
)
pszPath
;
}
return
(
LPSTR
)
pszPath
;
LPSTR
pos
;
TRACE
(
"%s
\n
"
,
pszPath
);
if
(
!
pszPath
||
!*
pszPath
)
return
NULL
;
if
(
!
(
pos
=
StrChrA
(
pszPath
,
'\\'
)))
return
(
LPSTR
)
pszPath
+
strlen
(
pszPath
);
pos
++
;
if
(
pos
[
0
]
==
'\\'
)
pos
++
;
return
pos
;
}
/*************************************************************************
...
...
@@ -2195,12 +2313,16 @@ LPSTR WINAPI PathFindNextComponentA(LPCSTR pszPath)
*/
LPWSTR
WINAPI
PathFindNextComponentW
(
LPCWSTR
pszPath
)
{
while
(
*
pszPath
)
{
if
(
*
pszPath
++==
'\\'
)
return
(
LPWSTR
)
pszPath
;
}
return
(
LPWSTR
)
pszPath
;
LPWSTR
pos
;
TRACE
(
"%s
\n
"
,
debugstr_w
(
pszPath
));
if
(
!
pszPath
||
!*
pszPath
)
return
NULL
;
if
(
!
(
pos
=
StrChrW
(
pszPath
,
'\\'
)))
return
(
LPWSTR
)
pszPath
+
lstrlenW
(
pszPath
);
pos
++
;
if
(
pos
[
0
]
==
'\\'
)
pos
++
;
return
pos
;
}
/*************************************************************************
...
...
@@ -2332,4 +2454,29 @@ BOOL WINAPI PathMakePrettyW(
{
FIXME
(
"%s
\n
"
,
debugstr_w
(
lpPath
));
return
TRUE
;
}
/*************************************************************************
* PathCommonPrefixA
*/
int
WINAPI
PathCommonPrefixA
(
LPCSTR
pszFile1
,
LPCSTR
pszFile2
,
LPSTR
achPath
)
{
FIXME
(
"%s %s %p
\n
"
,
pszFile1
,
pszFile2
,
achPath
);
return
0
;
}
/*************************************************************************
* PathCommonPrefixW
*/
int
WINAPI
PathCommonPrefixW
(
LPCWSTR
pszFile1
,
LPCWSTR
pszFile2
,
LPWSTR
achPath
)
{
FIXME
(
"%s %s %p
\n
"
,
debugstr_w
(
pszFile1
),
debugstr_w
(
pszFile2
),
achPath
);
return
0
;
}
dlls/shell32/shellstring.c
View file @
13d74c5f
...
...
@@ -126,7 +126,7 @@ HRESULT WINAPI StrRetToBufW (LPSTRRET src, LPITEMIDLIST pidl, LPWSTR dest, DWORD
*/
LPSTR
WINAPI
StrChrA
(
LPCSTR
str
,
INT
c
)
{
TRACE
(
"%s %i
stub
\n
"
,
str
,
c
);
TRACE
(
"%s %i
\n
"
,
str
,
c
);
return
strchr
(
str
,
c
);
}
...
...
dlls/shell32/shfolder.spec
0 → 100644
View file @
13d74c5f
name shfolder
type win32
import advapi32
@ stdcall SHGetFolderPathA(long long long long ptr)SHGetFolderPathA
@ stdcall SHGetFolderPathW(long long long long ptr)SHGetFolderPathW
dlls/shell32/shlwapi.spec
View file @
13d74c5f
...
...
@@ -465,8 +465,8 @@ type win32
@ stdcall PathCanonicalizeW (ptr wstr) PathCanonicalizeW
@ stdcall PathCombineA (ptr ptr ptr) PathCombineA
@ stdcall PathCombineW (ptr ptr ptr) PathCombineW
@ st
ub
PathCommonPrefixA
@ st
ub
PathCommonPrefixW
@ st
dcall PathCommonPrefixA(str str ptr)
PathCommonPrefixA
@ st
dcall PathCommonPrefixW(wstr wstr ptr)
PathCommonPrefixW
@ stub PathCompactPathA
@ stub PathCompactPathExA
@ stub PathCompactPathExW
...
...
include/shell.h
View file @
13d74c5f
...
...
@@ -85,44 +85,9 @@ BOOL WINAPI SHGetPathFromIDListW (LPCITEMIDLIST pidl,LPWSTR pszPath);
DWORD
WINAPI
SHAddToRecentDocs
(
UINT
uFlags
,
LPCVOID
pv
);
/****************************************************************************
* SHGetSpecialFolderLocation API
*/
HRESULT
WINAPI
SHGetSpecialFolderLocation
(
HWND
,
INT
,
LPITEMIDLIST
*
);
/****************************************************************************
* other functions
*/
#define CSIDL_DESKTOP 0x0000
#define CSIDL_PROGRAMS 0x0002
#define CSIDL_CONTROLS 0x0003
#define CSIDL_PRINTERS 0x0004
#define CSIDL_PERSONAL 0x0005
#define CSIDL_FAVORITES 0x0006
#define CSIDL_STARTUP 0x0007
#define CSIDL_RECENT 0x0008
#define CSIDL_SENDTO 0x0009
#define CSIDL_BITBUCKET 0x000a
#define CSIDL_STARTMENU 0x000b
#define CSIDL_DESKTOPDIRECTORY 0x0010
#define CSIDL_DRIVES 0x0011
#define CSIDL_NETWORK 0x0012
#define CSIDL_NETHOOD 0x0013
#define CSIDL_FONTS 0x0014
#define CSIDL_TEMPLATES 0x0015
#define CSIDL_COMMON_STARTMENU 0x0016
#define CSIDL_COMMON_PROGRAMS 0X0017
#define CSIDL_COMMON_STARTUP 0x0018
#define CSIDL_COMMON_DESKTOPDIRECTORY 0x0019
#define CSIDL_APPDATA 0x001a
#define CSIDL_PRINTHOOD 0x001b
#define CSIDL_ALTSTARTUP 0x001d
#define CSIDL_COMMON_ALTSTARTUP 0x001e
#define CSIDL_COMMON_FAVORITES 0x001f
#define CSIDL_INTERNET_CACHE 0x0020
#define CSIDL_COOKIES 0x0021
#define CSIDL_HISTORY 0x0022
#ifdef __cplusplus
}
/* extern "C" */
#endif
/* defined(__cplusplus) */
...
...
include/shlobj.h
View file @
13d74c5f
...
...
@@ -422,7 +422,64 @@ void WINAPI SHChangeNotifyA(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID
void
WINAPI
SHChangeNotifyW
(
LONG
wEventId
,
UINT
uFlags
,
LPCVOID
dwItem1
,
LPCVOID
dwItem2
);
#define SHChangeNotify WINELIB_NAME_AW(SHChangeNotify)
/**********************************************************************/
/****************************************************************************
* SHGetSpecialFolderLocation API
*/
HRESULT
WINAPI
SHGetSpecialFolderLocation
(
HWND
,
INT
,
LPITEMIDLIST
*
);
#define CSIDL_DESKTOP 0x0000
#define CSIDL_INTERNET 0x0001
#define CSIDL_PROGRAMS 0x0002
#define CSIDL_CONTROLS 0x0003
#define CSIDL_PRINTERS 0x0004
#define CSIDL_PERSONAL 0x0005
#define CSIDL_FAVORITES 0x0006
#define CSIDL_STARTUP 0x0007
#define CSIDL_RECENT 0x0008
#define CSIDL_SENDTO 0x0009
#define CSIDL_BITBUCKET 0x000a
#define CSIDL_STARTMENU 0x000b
#define CSIDL_DESKTOPDIRECTORY 0x0010
#define CSIDL_DRIVES 0x0011
#define CSIDL_NETWORK 0x0012
#define CSIDL_NETHOOD 0x0013
#define CSIDL_FONTS 0x0014
#define CSIDL_TEMPLATES 0x0015
#define CSIDL_COMMON_STARTMENU 0x0016
#define CSIDL_COMMON_PROGRAMS 0X0017
#define CSIDL_COMMON_STARTUP 0x0018
#define CSIDL_COMMON_DESKTOPDIRECTORY 0x0019
#define CSIDL_APPDATA 0x001a
#define CSIDL_PRINTHOOD 0x001b
#define CSIDL_ALTSTARTUP 0x001d
#define CSIDL_COMMON_ALTSTARTUP 0x001e
#define CSIDL_COMMON_FAVORITES 0x001f
#define CSIDL_INTERNET_CACHE 0x0020
#define CSIDL_COOKIES 0x0021
#define CSIDL_HISTORY 0x0022
#define CSIDL_COMMON_APPDATA 0x0023
#define CSIDL_WINDOWS 0x0024
#define CSIDL_SYSTEM 0x0025
#define CSIDL_PROGRAM_FILES 0x0026
#define CSIDL_MYPICTURES 0x0027
#define CSIDL_PROFILE 0x0028
#define CSIDL_SYSTEMX86 0x0029
#define CSIDL_PROGRAM_FILESX86 0x002a
#define CSIDL_PROGRAM_FILES_COMMON 0x002b
#define CSIDL_PROGRAM_FILES_COMMONX86 0x002c
#define CSIDL_COMMON_TEMPLATES 0x002d
#define CSIDL_COMMON_DOCUMENTS 0x002e
#define CSIDL_COMMON_ADMINTOOLS 0x002f
#define CSIDL_ADMINTOOLS 0x0030
#define CSIDL_CONNECTIONS 0x0031
#define CSIDL_FOLDER_MASK 0x00ff
#define CSIDL_FLAG_DONT_VERIFY 0x4000
#define CSIDL_FLAG_CREATE 0x8000
#define CSIDL_FLAG_MASK 0xff00
#ifdef __cplusplus
}
/* extern "C" */
...
...
include/shlwapi.h
View file @
13d74c5f
...
...
@@ -37,6 +37,10 @@ BOOL WINAPI PathStripToRootA(LPSTR pszPath);
BOOL
WINAPI
PathStripToRootW
(
LPWSTR
pszPath
);
#define PathStripToRoot WINELIB_NAME_AW(PathStripToRoot)
LPSTR
WINAPI
StrChrA
(
LPCSTR
lpStart
,
WORD
wMatch
);
LPWSTR
WINAPI
StrChrW
(
LPCWSTR
lpStart
,
WCHAR
wMatch
);
#define StrChr WINELIB_NAME_AW(StrChr)
#ifdef __cplusplus
}
/* extern "C" */
#endif
/* defined(__cplusplus) */
...
...
include/wine/undocshell.h
View file @
13d74c5f
...
...
@@ -588,10 +588,10 @@ LPWSTR WINAPI PathRemoveBlanksW(LPWSTR lpszPath);
#define PathRemoveBlanks WINELIB_NAME_AW(PathRemoveBlanks)
LPVOID
WINAPI
PathRemoveBlanksAW
(
LPVOID
lpszPath
);
LPSTR
WINAPI
PathQuoteSpacesA
(
LP
C
STR
path
);
LPWSTR
WINAPI
PathQuoteSpacesW
(
LP
C
WSTR
path
);
LPSTR
WINAPI
PathQuoteSpacesA
(
LPSTR
path
);
LPWSTR
WINAPI
PathQuoteSpacesW
(
LPWSTR
path
);
#define PathQuoteSpaces WINELIB_NAME_AW(PathQuoteSpaces)
LPVOID
WINAPI
PathQuoteSpacesAW
(
LP
C
VOID
path
);
LPVOID
WINAPI
PathQuoteSpacesAW
(
LPVOID
path
);
void
WINAPI
PathUnquoteSpaces
(
LPSTR
lpszPath
);
...
...
loader/loadorder.c
View file @
13d74c5f
...
...
@@ -60,6 +60,7 @@ static struct tagDllOverride {
{
"glide2x"
,
"so,native"
},
{
"odbc32"
,
"builtin"
},
{
"opengl32"
,
"builtin,native"
},
{
"shfolder"
,
"builtin,native"
},
{
NULL
,
NULL
},
};
...
...
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